05 August 2008
按下述要求实现 StreamChecker 类:
1
2
StreamChecker(words):构造函数,用给定的字词初始化数据结构。
query(letter):如果存在某些 k >= 1,可以用查询的最后 k个字符(按从旧到新顺序,包括刚刚查询的字母)拼写出给定字词表中的某一字词时,返回 true。否则,返回 false。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
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' 在字词表中。
Trie的模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
* Copyright (c) 2021
* Author: xiaoweixiang
*/
public class StreamChecker {
StringBuilder stringBuilder = new StringBuilder();
private TrieNode root;
int maxLength=0;
public StreamChecker(String[] words) {
/**
* 倒序插入
*/
root = new TrieNode();
for (String word : words) {
maxLength=Math.max(maxLength,word.length());
insert(new StringBuilder(word).reverse().toString());
}
}
public boolean query(char letter) {
stringBuilder.insert(0, letter);
if (stringBuilder.length()>maxLength) stringBuilder.deleteCharAt(stringBuilder.length()-1);
TrieNode temp=root;
for (int i = 0; i < stringBuilder.length(); i++) {
if (temp.next[stringBuilder.charAt(i)-'a']==null) return false;
temp=temp.next[stringBuilder.charAt(i)-'a'];
if(temp.isLeaf) return true;
}
return temp.isLeaf;
}
public void insert(String word) {
if (word == null || word.length() == 0) return;
TrieNode node = root;
int len = word.length();
for (int i = 0; i < len; i++) {
char c = word.charAt(i);
TrieNode tmp = node.next[c - 'a'];
if (tmp == null) {
tmp = new TrieNode();
node.next[c - 'a'] = tmp;
}
node = node.next[c - 'a'];
}
node.isLeaf = true;
}
public class TrieNode {
boolean isLeaf;
TrieNode[] next;
public TrieNode() {
next = new TrieNode[26];
}
}
}