设计一个支持以下两种操作的数据结构:
void addWord(word)
bool search(word)
search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。
示例:
addWord("bad")
addWord("dad")
addWord("mad")
search("pad") -> false
search("bad") -> true
search(".ad") -> true
search("b..") -> true
遇到.
用递归
此处Node节点使用数组实现,因为用Map超时了,可以看到还是数组比较快。
class WordDictionary {
private class Node{
public boolean isWord;
public Node[] next;
public Node() {
this.isWord = false;
this.next = new Node[26];
}
}
private Node root;
/** Initialize your data structure here. */
public WordDictionary() {
root = new Node();
}
/** Adds a word into the data structure. */
public void addWord(String word) {
Node cur = root;
for(int i = 0;i<word.length();i++){
char c = word.charAt(i);
if(cur.next[c-'a'] == null)
cur.next[c-'a'] = new Node();
cur = cur.next[c-'a'];
}
cur.isWord = true;
}
/** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
public boolean search(String word) {
return match(word, root, 0);
}
private boolean match(String word, Node node, int index){
if(index == word.length())
return node.isWord;
char c = word.charAt(index);
if(c!='.'){
if(node.next[c-'a']==null)
return false;
return match(word, node.next[c-'a'], index+1);
} else {
for(int i = 0;i<26;i++){
if(node.next[i]!=null && match(word, node.next[i], index+1))
return true;
}
return false;
}
}
}