最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)LeetCode(208.實(shí)現(xiàn)字典樹(前綴樹))

 更新時(shí)間:2021年08月09日 14:26:31   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(208.實(shí)現(xiàn)字典樹(前綴樹)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 208. Implement Trie (Prefix Tree) 實(shí)現(xiàn)字典樹(前綴樹)

Implement a trie with insert, search, and startsWith methods.

Example:

Trie trie = new Trie();

trie.insert("apple");
trie.search("apple");   // returns true
trie.search("app");     // returns false
trie.startsWith("app"); // returns true
trie.insert("app");  
trie.search("app");     // returns true

Note:

  • You may assume that all inputs are consist of lowercase letters a-z.
  • All inputs are guaranteed to be non-empty strings.

這道題讓我們實(shí)現(xiàn)一個(gè)重要但又有些復(fù)雜的數(shù)據(jù)結(jié)構(gòu)-字典樹, 又稱前綴樹或單詞查找樹,例如,一個(gè)保存了8個(gè)鍵的trie結(jié)構(gòu),"A", "to", "tea", "ted", "ten", "i", "in", and "inn"。

字典樹主要有如下三點(diǎn)性質(zhì):

1. 根節(jié)點(diǎn)不包含字符,除根節(jié)點(diǎn)意外每個(gè)節(jié)點(diǎn)只包含一個(gè)字符。

2. 從根節(jié)點(diǎn)到某一個(gè)節(jié)點(diǎn),路徑上經(jīng)過(guò)的字符連接起來(lái),為該節(jié)點(diǎn)對(duì)應(yīng)的字符串。

3. 每個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)包含的字符串不相同。

字母樹的插入(Insert)、刪除( Delete)和查找(Find)都非常簡(jiǎn)單,用一個(gè)一重循環(huán)即可,即第i 次循環(huán)找到前i 個(gè)字母所對(duì)應(yīng)的子樹,然后進(jìn)行相應(yīng)的操作。實(shí)現(xiàn)這棵字母樹,我們用最常見的數(shù)組保存(靜態(tài)開辟內(nèi)存)即可,當(dāng)然也可以開動(dòng)態(tài)的指針類型(動(dòng)態(tài)開辟內(nèi)存)。至于結(jié)點(diǎn)對(duì)兒子的指向,一般有三種方法:

1、對(duì)每個(gè)結(jié)點(diǎn)開一個(gè)字母集大小的數(shù)組,對(duì)應(yīng)的下標(biāo)是兒子所表示的字母,內(nèi)容則是這個(gè)兒子對(duì)應(yīng)在大數(shù)組上的位置,即標(biāo)號(hào);

2、對(duì)每個(gè)結(jié)點(diǎn)掛一個(gè)鏈表,按一定順序記錄每個(gè)兒子是誰(shuí);

3、使用左兒子右兄弟表示法記錄這棵樹。

三種方法,各有特點(diǎn)。第一種易實(shí)現(xiàn),但實(shí)際的空間要求較大;第二種,較易實(shí)現(xiàn),空間要求相對(duì)較小,但比較費(fèi)時(shí);第三種,空間要求最小,但相對(duì)費(fèi)時(shí)且不易寫。 

我們這里只來(lái)實(shí)現(xiàn)第一種方法,這種方法實(shí)現(xiàn)起來(lái)簡(jiǎn)單直觀,字母的字典樹每個(gè)節(jié)點(diǎn)要定義一個(gè)大小為 26 的子節(jié)點(diǎn)指針數(shù)組,然后用一個(gè)標(biāo)志符用來(lái)記錄到當(dāng)前位置為止是否為一個(gè)詞,初始化的時(shí)候講 26 個(gè)子節(jié)點(diǎn)都賦為空。那么 insert 操作只需要對(duì)于要插入的字符串的每一個(gè)字符算出其的位置,然后找是否存在這個(gè)子節(jié)點(diǎn),若不存在則新建一個(gè),然后再查找下一個(gè)。查找詞和找前綴操作跟 insert 操作都很類似,不同點(diǎn)在于若不存在子節(jié)點(diǎn),則返回 false。查找次最后還要看標(biāo)識(shí)位,而找前綴直接返回 true 即可。代碼如下:

class TrieNode {
public:
    TrieNode *child[26];
    bool isWord;
    TrieNode(): isWord(false) {
        for (auto &a : child) a = nullptr;
    }
};

class Trie {
public:
    Trie() {
        root = new TrieNode();
    }
    void insert(string s) {
        TrieNode *p = root;
        for (auto &a : s) {
            int i = a - 'a';
            if (!p->child[i]) p->child[i] = new TrieNode();
            p = p->child[i];
        }
        p->isWord = true;
    }
    bool search(string key) {
        TrieNode *p = root;
        for (auto &a : key) {
            int i = a - 'a';
            if (!p->child[i]) return false;
            p = p->child[i];
        }
        return p->isWord;
    }
    bool startsWith(string prefix) {
        TrieNode *p = root;
        for (auto &a : prefix) {
            int i = a - 'a';
            if (!p->child[i]) return false;
            p = p->child[i];
        }
        return true;
    }
    
private:
    TrieNode* root;
};

Github 同步地址: 

https://github.com/grandyang/leetcode/issues/208

類似題目:

Add and Search Word - Data structure design

Design Search Autocomplete System

Replace Words

Implement Magic Dictionary

參考資料:

https://leetcode.com/problems/implement-trie-prefix-tree/

https://leetcode.com/problems/implement-trie-prefix-tree/discuss/58832/AC-JAVA-solution-simple-using-single-array

https://leetcode.com/problems/implement-trie-prefix-tree/discuss/58986/Concise-O(1)-JAVA-solution-based-on-HashMap

https://leetcode.com/problems/implement-trie-prefix-tree/discuss/58842/Maybe-the-code-is-not-too-much-by-using-%22next26%22-C%2B%2B

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(208.實(shí)現(xiàn)字典樹(前綴樹))的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)實(shí)現(xiàn)字典樹(前綴樹)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++臨時(shí)對(duì)象導(dǎo)致的生命周期問(wèn)題

    c++臨時(shí)對(duì)象導(dǎo)致的生命周期問(wèn)題

    對(duì)象的生命周期是c++中非常重要的概念,它直接決定了你的程序是否正確以及是否存在安全問(wèn)題,這篇文章主要介紹了c++臨時(shí)對(duì)象導(dǎo)致的生命周期問(wèn)題 ,需要的朋友可以參考下
    2024-07-07
  • C++淺析數(shù)據(jù)在內(nèi)存中如何存儲(chǔ)

    C++淺析數(shù)據(jù)在內(nèi)存中如何存儲(chǔ)

    使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么
    2022-08-08
  • C++ 設(shè)置透明背景圖片

    C++ 設(shè)置透明背景圖片

    這篇文章主要介紹了C++ 設(shè)置透明背景圖片的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • C++ 程序員為什么看不起php程序員

    C++ 程序員為什么看不起php程序員

    由于當(dāng)今市場(chǎng)狀況,各種培訓(xùn)班飛起,PHPer越來(lái)越多,學(xué)習(xí)成本很低。導(dǎo)致了很多人對(duì)PHP的誤解。其實(shí)PHP學(xué)到深入的時(shí)候,所需知識(shí)很多,并不是表面看到的那樣。另外,PHP確實(shí)嚴(yán)謹(jǐn)性不高,這個(gè)跟C++,java確實(shí)都沒法比。但是,PHP在web開發(fā)中的效率,是其他語(yǔ)言所不能比的
    2017-02-02
  • C++中的多態(tài)與多重繼承實(shí)現(xiàn)與Java的區(qū)別

    C++中的多態(tài)與多重繼承實(shí)現(xiàn)與Java的區(qū)別

    這篇文章主要介紹了C++中的多態(tài)與多重繼承實(shí)現(xiàn)與Java的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C語(yǔ)言超細(xì)致講解分支語(yǔ)句

    C語(yǔ)言超細(xì)致講解分支語(yǔ)句

    分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語(yǔ)句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ(yǔ)句
    2022-05-05
  • C++基于socket多線程實(shí)現(xiàn)網(wǎng)絡(luò)聊天室

    C++基于socket多線程實(shí)現(xiàn)網(wǎng)絡(luò)聊天室

    這篇文章主要為大家詳細(xì)介紹了C++基于socket多線程實(shí)現(xiàn)網(wǎng)絡(luò)聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C語(yǔ)言詳細(xì)分析講解內(nèi)存管理malloc realloc free calloc函數(shù)的使用

    C語(yǔ)言詳細(xì)分析講解內(nèi)存管理malloc realloc free calloc函數(shù)的使用

    C語(yǔ)言內(nèi)存管理相關(guān)的函數(shù)主要有realloc、calloc、malloc、free等,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言內(nèi)存管理realloc、calloc、malloc、free函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 淺談c++中的異常處理機(jī)制

    淺談c++中的異常處理機(jī)制

    C++異常處理機(jī)制通過(guò)try/catch/throw結(jié)構(gòu)處理運(yùn)行時(shí)錯(cuò)誤,本文就來(lái)介紹一下c++中的異常處理機(jī)制,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • C語(yǔ)言 strftime 格式化顯示日期時(shí)間的實(shí)現(xiàn)

    C語(yǔ)言 strftime 格式化顯示日期時(shí)間的實(shí)現(xiàn)

    下面小編就為大家?guī)?lái)一篇C語(yǔ)言 strftime 格式化顯示日期時(shí)間的實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12

最新評(píng)論

连州市| 青冈县| 绵阳市| 宕昌县| 盖州市| 二连浩特市| 吉安县| 新昌县| 临安市| 铁力市| 乌拉特中旗| 陆良县| 青川县| 策勒县| 宁远县| 佛学| 三河市| 集贤县| 永城市| 宜兰县| 西乌珠穆沁旗| 环江| 吴堡县| 吉木乃县| 江陵县| 鱼台县| 盱眙县| 湖南省| 手机| 宁陕县| 神农架林区| 汉中市| 获嘉县| 汝城县| 辰溪县| 罗源县| 海门市| 阜南县| 罗江县| 黄陵县| 舟曲县|