请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。
实现词典类 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"); // 返回 False
wordDictionary.search("bad"); // 返回 True
wordDictionary.search(".ad"); // 返回 True
wordDictionary.search("b.."); // 返回 True
思路:使用字典树--》
class WordDictionary { TrialTree trialTree; public WordDictionary() { trialTree = new TrialTree(); } public void addWord(String word) { trialTree.insert(word); } public boolean search(String word) { return trialTree.likeSarch(word, 0, trialTree.root); } } class TrialTree { TrieNode root; public TrialTree() { this.root = new TrieNode('/'); } public boolean likeSarch(String word, int start, TrieNode cur) { if (start > word.length() - 1) { //达到尾部,并且当前节点含有结束的 if (cur != null && cur.end > 0) { return true; } return false; } char curChar = word.charAt(start); if (curChar != '.') { int index = curChar - 71; if (cur.next[index] != null) { return likeSarch(word, start + 1, cur.next[index]); } else { return false; } } else { TrieNode[] trieNodes = cur.next; for (TrieNode trieNode : trieNodes) { if (trieNode != null) { boolean f = likeSarch(word, start + 1, trieNode); if (f) { return true; } } } } return false; } public void insert(String str) { if (str == null) { return; } TrieNode cur = root; cur.pass++; char[] chars = str.toCharArray(); for (char ch : chars) { int index = ch - 71; if (cur.next[index] == null) { cur.next[index] = new TrieNode(ch); } cur = cur.next[index]; cur.pass++; } cur.end++; } } class TrieNode { TrieNode[] next; char ch; int pass; int end; public TrieNode(char ch) { next = new TrieNode[52]; pass = 0; end = 0; } }