leetcode211 Design Add and Search Words Data Structure-zh
        
 # 211. 添加与搜索单词 - 数据结构设计 (opens new window)
English Version (opens new window)
# 题目描述
请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。
实现词典类 WordDictionary :
WordDictionary()初始化词典对象void addWord(word)将word添加到数据结构中,之后可以对它进行匹配bool search(word)如果数据结构中存在字符串与word匹配,则返回true;否则,返回false。word中可能包含一些'.',每个.都可以表示任何一个字母。
示例:
输入:
["WordDictionary","addWord","addWord","addWord","search","search","search","search"]
[[],["bad"],["dad"],["mad"],["pad"],["bad"],[".ad"],["b.."]]
输出:
[null,null,null,null,false,true,true,true]
解释:
WordDictionary wordDictionary = new WordDictionary();
wordDictionary.addWord("bad");
wordDictionary.addWord("dad");
wordDictionary.addWord("mad");
wordDictionary.search("pad"); // return False
wordDictionary.search("bad"); // return True
wordDictionary.search(".ad"); // return True
wordDictionary.search("b.."); // return True
  提示:
1 <= word.length <= 500addWord中的word由小写英文字母组成search中的word由 '.' 或小写英文字母组成- 最多调用 
50000次addWord和search 
# 解法
“前缀树”实现。
# Python3
class Trie:
    def __init__(self):
        self.children = [None] * 26
        self.is_end = False
class WordDictionary:
    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.trie = Trie()
    def addWord(self, word: str) -> None:
        node = self.trie
        for c in word:
            index = ord(c) - ord('a')
            if node.children[index] is None:
                node.children[index] = Trie()
            node = node.children[index]
        node.is_end = True
    def search(self, word: str) -> bool:
        return self._search(word, self.trie)
    def _search(self, word: str, node: Trie) -> bool:
        for i in range(len(word)):
            c = word[i]
            index = ord(c) - ord('a')
            if c != '.' and node.children[index] is None:
                return False
            if c == '.':
                for j in range(26):
                    if node.children[j] is not None and self._search(word[i + 1:], node.children[j]):
                        return True
                return False
            node = node.children[index]
        return node.is_end
# Your WordDictionary object will be instantiated and called as such:
# obj = WordDictionary()
# obj.addWord(word)
# param_2 = obj.search(word)
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# Java
class WordDictionary {
    class Trie {
        Trie[] children;
        boolean isEnd;
        Trie() {
            children = new Trie[26];
            isEnd = false;
        }
    }
    private Trie trie;
    /** Initialize your data structure here. */
    public WordDictionary() {
        trie = new Trie();
    }
    public void addWord(String word) {
        Trie node = trie;
        for (int i = 0; i < word.length(); ++i) {
            char c = word.charAt(i);
            int index = c - 'a';
            if (node.children[index] == null) {
                node.children[index] = new Trie();
            }
            node = node.children[index];
        }
        node.isEnd = true;
    }
    public boolean search(String word) {
        return search(word, trie);
    }
    private boolean search(String word, Trie node) {
        for (int i = 0; i < word.length(); ++i) {
            char c = word.charAt(i);
            int index = c - 'a';
            if (c != '.' && node.children[index] == null) {
                return false;
            }
            if (c == '.') {
                for (int j = 0; j < 26; ++j) {
                    if (node.children[j] != null && search(word.substring(i + 1), node.children[j])) {
                        return true;
                    }
                }
                return false;
            }
            node = node.children[index];
        }
        return node.isEnd;
    }
}
/**
 * Your WordDictionary object will be instantiated and called as such:
 * WordDictionary obj = new WordDictionary();
 * obj.addWord(word);
 * boolean param_2 = obj.search(word);
 */
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# ...
 1
编辑  (opens new window)
  上次更新: 2021/10/30, 12:58:38