请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。
实现词典类 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;
}
}
本文介绍如何实现一个WordDictionary类,通过字典树数据结构实现对单词的添加和模糊匹配功能。通过'.ad'和'b..'的示例,展示了如何处理字符串中的通配符进行匹配查询。
915

被折叠的 条评论
为什么被折叠?



