描述
请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。
实现词典类 WordDictionary :
WordDictionary() 初始化词典对象
void addWord(word) 将 word 添加到数据结构中,之后可以对它进行匹配
bool search(word) 如果数据结构中存在字符串与 word 匹配,则返回 true ;否则,返回 false 。word 中可能包含一些 ‘.’ ,每个 . 都可以表示任何一个字母。
分析
数据结构所设计的对象如何实现全局使用?
下面是错误的方式:
class Trie{
boolean end;
Trie[] next;
}
class WordDictionary {
Trie root;
public WordDictionary() {
root = new Trie();
root.end = false;
root.next = new Trie[26];
}
public void addWord(String word) {
Trie cur = root;
for(int i = 0; i < word.length(); i++){
char ch = word.charAt(i);
if(cur.next[ch-'a'] == null){
cur.next[ch-'a'] = new Trie();
}
cur = cur.next[ch-'a'];
}
cur.end = true;
}
public boolean search(String word) {
return dfs(root,word,0);
}
public boolean dfs(Trie root, String word, int step){
....
}
}
正确的写法:
class Trie{
boolean end;
Trie[] next = new Trie[26];
}
class WordDictionary {
public WordDictionary() {
}
Trie root = new Trie();
public void addWord(String word) {
Trie cur = root;
for(int i = 0; i < word.length(); i++){
char ch = word.charAt(i);
if(cur.next[ch-'a'] == null){
cur.next[ch-'a'] = new Trie();
}
cur = cur.next[ch-'a'];
}
cur.end = true;
}
public boolean search(String word) {
return dfs(root,word,0);
}
public boolean dfs(Trie root, String word, int step){
if(step == word.length()){
return root.end;
}
char ch = word.charAt(step);
if(ch == '.'){
for(int i = 0; i < 26; i++){
if(root.next[i] != null){
if(dfs(root.next[i],word,step+1)){
return true;
}
}
}
return false;
}else{
if(root.next[ch-'a'] != null){
return dfs(root.next[ch-'a'],word,step+1);
}
}
return false;
}
}