设计一个支持以下两种操作的数据结构:
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
说明:你可以假设所有单词都是由小写字母 a-z 组成的。
思路就是构造字典树,对于每个单词,其在字典树最后一个节点标记一下为一个单词
在搜索的时候从根节点往下搜索即可,只是注意遇到点号的时候要将当前节点所有的子树都搜索
这道题时间卡得严一些,适当做一些优化
class WordDictionary {
class Trie{
boolean isWord;
Trie next[];
public Trie(){
next = new Trie[26];
}
}
Trie head ;
/**
* Initialize your data structure here.
*/
public WordDictionary() {
head = new Trie();
}
/**
* Adds a word into the data structure.
*/
public void addWord(String word) {
Trie cur = head;
for (char c : word.toCharArray()) {
if (null == cur.next[c - 'a']) {
cur.next[c - 'a'] = new Trie();
}
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 search(word.toCharArray(), head);
}
public boolean search(char[] word, Trie cur) {
if (cur == null) {
return false;
}
if (word.length == 0) {
if (cur.isWord) {
return true;
}
return false;
} else if (cur.next == null) {
return false;
}
if (word[0] == '.') {
for (int i = 0; i < 26; i++) {
if (cur.next[i] != null && search(Arrays.copyOfRange(word, 1, word.length), cur.next[i])) {
return true;
}
}
return false;
} else {
if (cur.next[word[0] - 'a'] != null && search(Arrays.copyOfRange(word, 1, word.length), cur.next[word[0] - 'a'])) {
return true;
}
return false;
}
}
}
/**
* Your WordDictionary object will be instantiated and called as such:
* WordDictionary obj = new WordDictionary();
* obj.addWord(word);
* boolean param_2 = obj.search(word);
*/