Problem Description
Ignatius最近遇到一個難題,老師交給他很多單詞(只有小寫字母組成,不會有重複的單詞出現),現在老師要他統計出以某個字串為字首的單詞數量(單詞本身也是自己的字首).
Input
輸入資料的第一部分是一張單詞表,每行一個單詞,單詞的長度不超過10,它們代表的是老師交給Ignatius統計的單詞,一個空行代表單詞表的結束.第二部分是一連串的提問,每行一個提問,每個提問都是一個字串.
注意:本題只有一組測試資料,處理到檔案結束.
Output
對於每個提問,給出以該字串為字首的單詞的數量.
##Sample Input
banana
band
bee
absolute
acm
ba
b
band
abc
Sample Output
2
3
1
0
這裡用到字首樹。字首樹的特點是,根節點為空,為它新增子節點時,以字母為鍵,子節點可以指定出現次數。
//字典樹(字首 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是字串的長度。所以效率還是比較高的。