每日一道leetcode(新學數據結構版)

208. 實現 Trie (前綴樹) - 力扣(LeetCode)

題目

Trie(發音類似 "try")或者說?前綴樹?是一種樹形數據結構,用于高效地存儲和檢索字符串數據集中的鍵。這一數據結構有相當多的應用情景,例如自動補全和拼寫檢查。

請你實現 Trie 類:

  • Trie()?初始化前綴樹對象。
  • void insert(String word)?向前綴樹中插入字符串?word?。
  • boolean search(String word)?如果字符串?word?在前綴樹中,返回?true(即,在檢索之前已經插入);否則,返回?false?。
  • boolean startsWith(String prefix)?如果之前已經插入的字符串?word?的前綴之一為?prefix?,返回?true?;否則,返回?false?。

示例:

輸入
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
輸出
[null, null, true, false, true, null, true]

解釋
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple");?? // 返回 True
trie.search("app");???? // 返回 False
trie.startsWith("app"); // 返回 True
trie.insert("app");
trie.search("app");???? // 返回 True

提示:

  • 1 <= word.length, prefix.length <= 2000
  • word?和?prefix?僅由小寫英文字母組成
  • insertsearch?和?startsWith?調用次數?總計?不超過?3 * 104?次

思路(以下思路是經過檢索學習后得出,有一部分的構造方法超出我的知識面了,所以不看的話構造不出來)

  1. 首先這個類本身并沒有內置于C++中,需要自己構造。
  2. 這個樹的思路比較清楚,是個26叉樹,因為其子節點分別都有可能是26個字母(除非存在某個字母不是英文單詞的開頭,不過顯然應該不存在這種情況),然后它還要具有一個功能就是判斷到達該節點時是不是組成了一個單詞。
  3. 有了這兩個基本的點那么就需要構造前綴樹的節點類:
    1. 定義一個bool類型變量作為是否是一個單詞的判斷,再每次插入完成后,對最后一個節點標記為單詞位。
    2. 另外需要保存子節點的指針,這里我以為可以直接繼續創建對象數組,但是查了一下發現C++僅支持定義自身類型的靜態對象或者是對象的指針,所以其實還是對樹節點的構造方式不夠了解——那么就是構造一個TrieNode* children[26]即可。
    3. 以上都需聲明為public類型,否則默認是private的,這樣其他類就無法調用。
  4. 接下來是操作邏輯:
    1. 初始化:現在Trie類中定義一個root的TrieNode*節點作為初始節點。
    2. 插入(insert):從根節點和插入單詞頭開始順序檢查對應位置的單詞是否在鏈中,若在就往下搜,若不在就對該子節點創建一個新的TrieNode對象。不斷重復知道單詞遍歷完成,最后將當前達到的節點的isWord更新為true。
    3. 查找(search):從根節點開始出發,根據待查找單詞從頭到尾的順序順鏈查找是否已經創建了對應的子節點對象,若是空指針,直接返回false。若遍歷完整個單詞了,需檢查對應的到達節點的isWord是否為true。
    4. 查找前綴(startsWith):和search的方法類似,但最后一步不需要判斷isWord,只要能找到這,那么就一定是前綴,直接返回true即可。

代碼實現

class TrieNode {public:bool isWord = false;TrieNode* children[26];
};
class Trie {
public:TrieNode* root;Trie() {root = new TrieNode();}void insert(string word) {TrieNode* cur = root;char c;for(int i = 0; i < word.length(); ++i) {c = int(word[i]-'a');if(cur->children[c] == nullptr) cur->children[c] = new TrieNode();cur = cur->children[c];}cur->isWord = true;}bool search(string word) {TrieNode* cur = root;char c;for(int i = 0; i < word.length(); ++i) {c = int(word[i]-'a');if(cur->children[c] == nullptr) return false;cur = cur->children[c];}return cur->isWord;}bool startsWith(string prefix) {TrieNode* cur = root;char c;for(int i = 0; i < prefix.length(); ++i) {c = int(prefix[i]-'a');if(cur->children[c] == nullptr) return false;cur = cur->children[c];}return true;}
};/*** Your Trie object will be instantiated and called as such:* Trie* obj = new Trie();* obj->insert(word);* bool param_2 = obj->search(word);* bool param_3 = obj->startsWith(prefix);*/

復雜度分析

  • 時間復雜度:因為直接順鏈查找即可,插入、查找、判斷前綴的時間復雜度都是O(n)的,初始化的時間復雜度是O(1)的。
  • 空間復雜度:設需要插入的字符串長度之和為L,那么最壞情況的空間復雜度就是26L,若擴展應用范圍,如果不是26個字符,而是字符集規模為S,則空間復雜度為O(LS)。

題解

  • 官解的節點的實現是內置的,將Trie類直接當成TrieNode使用,邏輯也是一致的,不過感覺這樣寫對于類的定義就很模糊,感覺有點dirty,樹和節點還是分開定義比較好,不然屬性展現的是節點的屬性,函數卻展現的是樹的功能。——雖然代碼量少了,但是可讀性就差了,感覺不是個好實現。
  • 官解有一個點很可取,判斷前綴和查找的功能有很大程度的重合,是可以封裝的,確實得鍛煉鍛煉對這種情況的直覺,避免寫出太冗余的代碼。
  • 看了其他人的題解發現自己還是太死板了,直接用哈希表貌似很快就能秒了。
    • 首先存一個單詞哈希表,然后每次插入定義一個循環存前綴哈希表,時間復雜度是一致的。但是空間復雜度小了,因為很多沒出現的節點就不用另外保存了!
    • 還是聰明人多啊!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906159.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906159.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906159.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【自然語言處理與大模型】大模型(LLM)基礎知識④

&#xff08;1&#xff09;微調主要用來干什么&#xff1f; 微調目前最主要用在定制模型的自我認知和改變模型對話風格。模型能力的適配與強化只是輔助。 定制模型的自我認知&#xff1a;通過微調可以調整模型對自我身份、角色功能的重新認知&#xff0c;使其回答更加符合自定義…

基于 Spring Boot 瑞吉外賣系統開發(十五)

基于 Spring Boot 瑞吉外賣系統開發&#xff08;十五&#xff09; 前臺用戶登錄 在登錄頁面輸入驗證碼&#xff0c;單擊“登錄”按鈕&#xff0c;頁面會攜帶輸入的手機號和驗證碼向“/user/login”發起請求。 定義UserMapper接口 Mapper public interface UserMapper exte…

什么是TCP協議?它存在哪些安全挑戰?

一、TCP協議概述 TCP&#xff08;傳輸控制協議&#xff09;是互聯網中面向連接、可靠的傳輸層協議&#xff0c;主要負責在不可靠的IP層上實現數據的可靠傳輸。其核心特點包括&#xff1a; 面向連接&#xff1a;通信前需通過三次握手&#xff08;SYN-SYN/ACK-ACK&#xff09;建…

12條熱門照片提示

12條熱門照片提示 1. 賽博朋克光彩 (Cyberpunk Glow-Up) 未在文件中顯示2. 卡通化我 (Cartoonify Me) Convert this image of [your subject here] into a 3D Pixar-style cartoon clean lines, soft lighting, expressive features, and a polished render that feels cine…

Java求職面試揭秘:從Spring到微服務的技術挑戰

文章簡述 在這篇文章中&#xff0c;我們將通過一個幽默的面試場景&#xff0c;揭秘互聯網大廠Java求職者在面試中面對的技術挑戰。面試官將從Spring框架、微服務架構到大數據處理等多個維度進行提問&#xff0c;并詳細講解這些技術點的應用場景和解決方案&#xff0c;幫助小白…

用Python輸出一個文件夾的所有文件結構

輸出一個文件夾的所有目錄和文件結構 新建一個Python文件&#xff0c;輸入 這個文件表示查詢一個文件夾所有的目錄結構 import osdef print_directory_structure(root_dir):"""打印樹狀目錄結構&#xff08;優化版&#xff09;"""if not os.p…

R語言的專業網站top5推薦

李升偉 以下是學習R語言的五個頂級專業網站推薦&#xff0c;涵蓋教程、社區、資源庫和最新動態&#xff1a; 1.R項目官網 (r-project.org) R語言的官方網站&#xff0c;提供軟件下載、文檔、手冊和常見問題解答。特別適合初學者和高級用戶&#xff0c;是獲取R語言核心資源的…

IntelliJ IDEA給Controller、Service、Mapper不同文件設置不同的文件頭注釋模板、Velocity模板引擎

通過在 IntelliJ IDEA 中的 “Includes” 部分添加多個文件頭模板&#xff0c;并在 “Files” 模板中利用這些包含來實現不同類型文件的注釋。以下是為 Controller、Service、Mapper 文件設置不同文件頭的完整示例&#xff1a; 1. 設置 Includes 文件頭模板 File > Settin…

LabVIEW雙音信號互調失真測量

該VI構建實現了一套完整的雙音信號互調失真&#xff08;IMD&#xff09;測量系統。該系統通過精確控制信號生成、采集與分析流程&#xff0c;實現對被測設備&#xff08;DUT&#xff09;非線性特性的量化評估&#xff0c;可廣泛應用于通信設備、音頻系統、射頻器件等領域的研發…

56.合并區間(java)

題目描述&#xff1a; 1.先判斷給定intervals是否為空或者大小是否為1&#xff0c;是則直接返回intervals。 2.對intervals進行排序 數組形式則使用&#xff1a;Arrays.sort(intevals,(a,b)->Integer.compare(a[0],b[0])); ArrayList形式&#xff1a;intervals.sort((a,b)-…

Redis設計與實現——Redis命令參考與高級特性

Redis命令參考 數據類型相關命令 SET&#xff1a;設置鍵值&#xff0c;支持過期時間、不存在/存在條件。GET&#xff1a;獲取鍵值&#xff0c;若鍵不存在返回 nil。INCR/DECR&#xff1a;將鍵的整數值增1/減1&#xff0c;鍵不存在時初始化為0。MSET/MGET&#xff1a;批量設置…

基于 STM32 的全自動洗車監控系統設計與實現

摘要 本文提出一種基于 STM32F103RCT6 芯片的全自動洗車監控系統方案,通過多傳感器融合與智能控制算法,實現車輛檢測、洗車流程自動化及狀態遠程監控。系統集成硬件選型、電路設計、軟件流程及通信功能,可廣泛應用于智能洗車場景。 一、硬件系統設計 1. 核心芯片選型 主控…

掌握Multi-Agent實踐(七):基于AgentScope分布式模式實現多智能體高效協作[并行加速大模型輔助搜索、分布式多用戶協同辯論賽]

之前的案例都是運行在單臺機器上以單進程形式運行,受限于 Python 的全局解釋器鎖,實際只能有效利用一個 CPU 的計算資源,并且無法支持多個用戶從自己的電腦上接入同一個 Multi-Agent 應用進行交互。?為了提高運行效率并支持多用戶接入同一個應用中,AgentScope 提供了分布式…

docker-compose部署項目(springboot服務)以及基礎環境(mysql、redis等)ruoyi-ry

上傳jar 配置文件等 到目錄&#xff1a;/home/ruoyi/docker 設置權限 chmod x *.sh 開通端口&#xff08;我已經開通了&#xff09; sh ./deploy.sh port 開始構建 docker-compose build 構建成功 可以先拉取鏡像 docker pull nacos/nacos-server docker pull nginx docker …

Axure疑難雜癥:統計分析頁面引入Echarts示例動態效果

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝! Axure產品經理精品視頻課已登錄CSDN可點擊學習https://edu.csdn.net/course/detail/40420 課程主題:統計分析頁面引入Echarts示例動態效果 主要內容:echart示例引入、大小調整、數據導入 應用場景:統計分析頁面…

如何使用WordPress創建美食博客

不管你是否意識到&#xff0c;食物是我們生活的核心。有些人將其用作燃料&#xff0c;而另一些人則將食譜作為一種藝術形式呈現。如果您屬于后者&#xff0c;并且想創建一個美食博客來分享您的熱情&#xff0c;那么WordPress是一個頂級平臺。 幾乎每個話題都有一個博客利基&am…

【MySQL】庫與表的操作

一、庫的操作 1. 查看數據庫 語法&#xff1a;show databases;這里的database是要加s的 查看當前自己所處的數據庫&#xff1a;select database(); 例如下圖&#xff0c;我當前所處的數據庫就是在class1數據庫 2. 創建數據庫 語法&#xff1a;create database [if not e…

Unity3D開發AI桌面精靈/寵物系列 【六】 人物模型 語音口型同步 LipSync 、梅爾頻譜MFCC技術、支持中英文自定義編輯- 基于 C# 語言開發

Unity3D開發AI桌面精靈/寵物系列 【六】 人物模型 語音口型同步 LipSync 、梅爾頻譜MFCC技術 C# 語言開發 該系列主要介紹怎么制作AI桌面寵物的流程&#xff0c;我會從項目開始創建初期到最終可以和AI寵物進行交互為止&#xff0c;項目已經開發完成&#xff0c;我會仔細梳理一下…

MoonBit正式入駐GitCode!AI時代的編程語言新星,開啟高性能開發新紀元

在AI與編程語言深度交融的今天&#xff0c;開發者們正見證一場技術生產力的革命。由IDEA研究院基礎軟件中心傾力打造的MoonBit&#xff08;月兔&#xff09;編程語言&#xff0c;自2023年橫空出世以來&#xff0c;憑借高性能、低延遲、輕量化的特性&#xff0c;迅速成為全球開發…

LLMs:《POE報告:2025年春季人工智能模型使用趨勢》解讀

LLMs&#xff1a;《POE報告&#xff1a;2025年春季人工智能模型使用趨勢》解讀 導讀&#xff1a;2025年5月13日&#xff0c;該報告基于 Poe 平臺的用戶數據&#xff0c;分析了 2025 年春季人工智能模型的使用趨勢。報告指出&#xff0c;人工智能格局快速演變&#xff0c;通用文…