字典樹的應用

weixin_34162629發表於2017-03-31

Problem Description

Ignatius最近遇到一個難題,老師交給他很多單詞(只有小寫字母組成,不會有重複的單詞出現),現在老師要他統計出以某個字串為字首的單詞數量(單詞本身也是自己的字首).

Input

輸入資料的第一部分是一張單詞表,每行一個單詞,單詞的長度不超過10,它們代表的是老師交給Ignatius統計的單詞,一個空行代表單詞表的結束.第二部分是一連串的提問,每行一個提問,每個提問都是一個字串.

注意:本題只有一組測試資料,處理到檔案結束.

Output

對於每個提問,給出以該字串為字首的單詞的數量.

##Sample Input
banana
band
bee
absolute
acm

ba
b
band
abc

Sample Output

2
3
1
0

65123-20170331165244617-481243213.png

這裡用到字首樹。字首樹的特點是,根節點為空,為它新增子節點時,以字母為鍵,子節點可以指定出現次數。

        //字典樹(字首 Trie)
        var trie = {}


        function add(trie, str) { //構建一個trie
            for (var i = 0, n = str.length; i < n; i++) {
                var c = str[i]
                if (trie[c] == null) {
                    trie[c] = {
                        val: c,
                        deep: i,
                        appearCount: 1
                    }
                    trie = trie[c]
                } else {
                    trie = trie[c]
                    trie.appearCount++
                }
            }

        }

        add(trie, "banana")
        add(trie, "band")
        add(trie, "bee")
        add(trie, "absolute")
        add(trie, "acm")

        console.log(trie)

        function has(trie, str) {
            for (var i = 0, n = str.length; i < n; i++) {
                var c = str[i]
                if (c in trie) {
                    trie = trie[c]
                    if (i === n - 1) {
                        console.log(trie.appearCount)
                        return trie.appearCount
                    }
                } else {
                    console.log(0)
                    return 0
                }
            }
            console.log(0) //0為找不到
            return 0
        }
        console.log('answer:')
        has(trie, 'ba')
        has(trie, 'b')
        has(trie, 'band')
        has(trie, 'abc')

字典樹的查詢時間複雜度是O(logL),L是字串的長度。所以效率還是比較高的。

相關文章