按下述要求实现 StreamChecker 类:
StreamChecker(words):构造函数,用给定的字词初始化数据结构。
query(letter):如果存在某些 k >= 1,可以用查询的最后 k个字符(按从旧到新顺序,包括刚刚查询的字母)拼写出给定字词表中的某一字词时,返回 true。否则,返回 false。
示例:
StreamChecker streamChecker = new StreamChecker([“cd”,“f”,“kl”]); // 初始化字典
streamChecker.query(‘a’); // 返回 false
streamChecker.query(‘b’); // 返回 false
streamChecker.query(‘c’); // 返回 false
streamChecker.query(‘d’); // 返回 true,因为 ‘cd’ 在字词表中
streamChecker.query(‘e’); // 返回 false
streamChecker.query(‘f’); // 返回 true,因为 ‘f’ 在字词表中
streamChecker.query(‘g’); // 返回 false
streamChecker.query(‘h’); // 返回 false
streamChecker.query(‘i’); // 返回 false
streamChecker.query(‘j’); // 返回 false
streamChecker.query(‘k’); // 返回 false
streamChecker.query(‘l’); // 返回 true,因为 ‘kl’ 在字词表中。
提示:
1 <= words.length <= 2000
1 <= words[i].length <= 2000
字词只包含小写英文字母。
待查项只包含小写英文字母。
待查项最多 40000 个。
代码:
class StreamChecker {
Node root = null;
List<Character> qs = null;
public StreamChecker(String[] words) {
root = new Node();
qs = new ArrayList<Character>();
for(String word : words){
Node cur = root;
int i = word.length() - 1;
while(i >= 0) {
char c = word.charAt(i);
int index = (int)c - (int)'a';
if(cur.childs[index] == null){
cur.childs[index] = new Node();
}
cur = cur.childs[index];
i--;
}
cur.leaf = true;
}
}
public boolean query(char letter) {
qs.add(letter);
int index = qs.size() - 1;
Node cur = root;
while(index >= 0){
if(cur.leaf){
return true;
}
int j = (int)qs.get(index) - (int)'a';
if(cur.childs[j] == null){
return false;
}else{
cur = cur.childs[j];
}
index--;
}
if(cur.leaf){
return true;
}
return false;
}
}
class Node{
Node[] childs = null;
boolean leaf = false;
public Node(){
childs = new Node[26];
}
}