208:前綴樹

題意

Trie(發(fā)音類似 "try")或者說 前綴樹 是一種樹形數(shù)據(jù)結(jié)構(gòu)川抡,用于高效地存儲(chǔ)和檢索字符串?dāng)?shù)據(jù)集中的鍵禾怠。這一數(shù)據(jù)結(jié)構(gòu)有相當(dāng)多的應(yīng)用情景莫湘,例如自動(dòng)補(bǔ)完和拼寫檢查倾鲫。

請(qǐng)你實(shí)現(xiàn) Trie 類:

Trie() 初始化前綴樹對(duì)象粗合。
void insert(String word) 向前綴樹中插入字符串 word。
boolean search(String word) 如果字符串 word 在前綴樹中乌昔,返回 true(即隙疚,在檢索之前已經(jīng)插入);否則玫荣,返回 false甚淡。
boolean startsWith(String prefix) 如果之前已經(jīng)插入的字符串 word 的前綴之一為 prefix大诸,返回 true捅厂;否則,返回 false资柔。

分析

前綴樹是一種樹形結(jié)構(gòu)焙贷,其將一個(gè)字符串表示在一棵樹中,例如:


繪圖1.png

其中保存了數(shù)據(jù)【APP贿堰、APPLE辙芍、TIRE】其中,黃色節(jié)點(diǎn)表示含有這個(gè)對(duì)象,藍(lán)色表示只是路徑節(jié)點(diǎn)故硅。
注意:前綴樹是有一個(gè)總的虛擬頭節(jié)點(diǎn)庶灿。

題解

// 定義節(jié)點(diǎn)結(jié)構(gòu)
class TireNode {
    char value;// 當(dāng)前節(jié)點(diǎn)的值
    boolean isExists = false;// 當(dāng)前節(jié)點(diǎn)是都被包含【上述黃色節(jié)點(diǎn)】
    HashMap<Character, TireNode> children = new HashMap<Character, TireNode>();//【具體的分支】

    public TireNode(char value) {
        this.value = value;
    }
}
// 實(shí)現(xiàn)前綴樹
class Trie {
    // 虛擬頭節(jié)點(diǎn)
    TireNode dummyHead = new TireNode('-');

    public void insert(String word) {
        // 處理特殊情況
        if (word == null || word.length() == 0) return;
        // 是否需要?jiǎng)?chuàng)建根節(jié)點(diǎn)
        insertSub(word, 0, dummyHead.children);
    }

    // 將指定元素插入前綴樹的指定位置
    public void insertSub(String word, int start, HashMap<Character, TireNode> children) {
        // 插入到元素末尾,直接返回
        if (start == word.length()) return;

        if (children.containsKey(word.charAt(start))) {
            TireNode tireNodeTemp = children.get(word.charAt(start));
            // 判斷是否存在當(dāng)前元素
            if (start == word.length() - 1) tireNodeTemp.isExists = true;
            insertSub(word, start + 1, tireNodeTemp.children);
            // 不包含當(dāng)前節(jié)點(diǎn)
        } else {
            TireNode node = new TireNode(word.charAt(start));
            // 判斷是否存在當(dāng)前元素
            if (start == word.length() - 1) node.isExists = true;
            children.put(word.charAt(start), node);
            // 插入元素
            insertSub(word, start + 1, node.children);
        }
    }

     // 查找特定字符串
    public boolean search(String word) {
        TireNode tireNodeResult = searchSub(word, 0, dummyHead.children.get(word.charAt(0)));
        if (tireNodeResult == null) return false;
        return tireNodeResult.isExists;
    }


    public TireNode searchSub(String word, int start, TireNode tireNode) {
        if (tireNode == null) return null;
        if (tireNode.value == word.charAt(start)) {
            if (start == word.length() - 1) return tireNode;
            // 尋找下一個(gè)字符
            if (start + 1 < word.length())
                return searchSub(word, start + 1, tireNode.children.get(word.charAt(start + 1)));
        }
        return null;
    }

    // 是否有前綴
    public boolean startsWith(String prefix) {
        TireNode tireNodeResult = searchSub(prefix, 0, dummyHead.children.get(prefix.charAt(0)));
        if (tireNodeResult == null) return false;
        return true;
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吃衅,一起剝皮案震驚了整個(gè)濱河市往踢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌徘层,老刑警劉巖峻呕,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異趣效,居然都是意外死亡瘦癌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門跷敬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讯私,“玉大人,你說我怎么就攤上這事西傀⊥保” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵池凄,是天一觀的道長抡驼。 經(jīng)常有香客問我,道長肿仑,這世上最難降的妖魔是什么致盟? 我笑而不...
    開封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮尤慰,結(jié)果婚禮上馏锡,老公的妹妹穿的比我還像新娘。我一直安慰自己伟端,他們只是感情好杯道,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著责蝠,像睡著了一般党巾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霜医,一...
    開封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天齿拂,我揣著相機(jī)與錄音,去河邊找鬼肴敛。 笑死署海,一個(gè)胖子當(dāng)著我的面吹牛吗购,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播砸狞,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼捻勉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刀森?” 一聲冷哼從身側(cè)響起贯底,我...
    開封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撒强,沒想到半個(gè)月后禽捆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡飘哨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年胚想,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芽隆。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浊服,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胚吁,到底是詐尸還是另有隱情牙躺,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布腕扶,位于F島的核電站孽拷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏半抱。R本人自食惡果不足惜脓恕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窿侈。 院中可真熱鬧炼幔,春花似錦、人聲如沸史简。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圆兵。三九已至跺讯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衙傀,已是汗流浹背抬吟。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留统抬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像聪建,于是被迫代替她去往敵國和親钙畔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容