题目描述:
按下述要求实现 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 Mytree{
boolean isend;
Mytree child[] = new Mytree[26];
}
class StreamChecker {
Mytree tree;
List<Character> list;
public StreamChecker(String[] words) {
list = new ArrayList<>();
tree = new Mytree();
for (String string : words) {
Mytree temroot = tree;
char tem[] = string.toCharArray();
for (int i = tem.length - 1; i >= 0; i--) {
char c = tem[i];
if(temroot.child[c - 'a'] == null){
temroot.child[c - 'a'] = new Mytree();
}
temroot = temroot.child[c - 'a'];
}
temroot.isend = true;
}
}
public boolean query(char letter) {
list.add(letter);
Mytree tem = tree;
int size = list.size();
for (int i = size - 1; i >= 0 ; i--) {
if(tem.child[list.get(i) - 'a'] == null){
return false;
}else {
tem = tem.child[list.get(i) - 'a'];
if(tem.isend){
return true;
}
}
}
return false;
}
}