题目
请你设计一个数据结构,支持 添加新单词 和
查找字符串是否与任何先前添加的字符串匹配 。
实现词典类 WordDictionary
:
WordDictionary()
初始化词典对象
void addWord(word)
将 word
添加到数据结构中,之后可以对它进行匹配
bool search(word)
如果数据结构中存在字符串与
word
匹配,则返回 true
;否则,返回
false
。word
中可能包含一些 '.'
,每个 .
都可以表示任何一个字母。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 输入: ["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"); // 返回 False wordDictionary.search("bad"); // 返回 True wordDictionary.search(".ad"); // 返回 True wordDictionary.search("b.."); // 返回 True
|
提示:
1 <= word.length <= 25
addWord
中的 word
由小写英文字母组成
search
中的 word
由 '.'
或小写英文字母组成
- 最多调用
104
次 addWord
和
search
题解
这一题的思路和208
其实是类似的,只有搜索的函数有变化。
搜索的时候如果是字母,就获取当前字母所在的位置,然后往后搜索;
如果遇到.
了,需要遍历所有items
位置,找到一个不为空的往下搜索;
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
| class WordDictionary { private WordDictionary[] items; boolean isEnd;
public WordDictionary() { items = new WordDictionary[26]; }
public void addWord(String word) { WordDictionary curr = this; int n = word.length(); for (int i = 0; i < n; i++) { int index = word.charAt(i) - 'a'; if (curr.items[index] == null) curr.items[index] = new WordDictionary(); curr = curr.items[index]; } curr.isEnd = true; }
public boolean search(String word) { return search(this, word, 0); }
private boolean search(WordDictionary curr, String word, int start) { int n = word.length(); if (start == n) return curr.isEnd; char c = word.charAt(start); if (c != '.') { WordDictionary item = curr.items[c - 'a']; return item != null && search(item, word, start + 1); }
for (int j = 0; j < 26; j++) { if (curr.items[j] != null && search(curr.items[j], word, start + 1)) return true; } return false; } }
|