设计一个算法:接收一个字符流,并检查这些字符的后缀是否是字符串数组 words 中的一个字符串。
例如,words = ["abc", "xyz"] 且字符流中逐个依次加入 4 个字符 'a'、'x'、'y' 和 'z' ,你所设计的算法应当可以检测到 "axyz" 的后缀 "xyz" 与 words 中的字符串 "xyz" 匹配。
按下述要求实现 StreamChecker 类:
- StreamChecker (String [] words) :构造函数,用字符串数组 words 初始化数据结构。
 - boolean query (char letter):从字符流中接收一个新字符,如果字符流中的任一非空后缀能匹配 words 中的某一字符串,返回 true ;否则,返回 false。
 
# 解题思路
暴力模拟:最多存储 max(words[i].length()) 个字符,每次存储字符前需要进行移位操作;
# 提交记录
# 代码
class StreamChecker {  | |
private final Set<String> set;  | |
private final int min;  | |
    // private final int max; | |
private char[] data;  | |
private int size;  | |
public StreamChecker(String[] words) {  | |
int mint = 201;  | |
int maxt = 0;  | |
set = new HashSet<>();  | |
for (String w : words) {  | |
set.add(w);  | |
mint = Math.min(mint, w.length());  | |
maxt = Math.max(maxt, w.length());  | |
        } | |
min = mint;  | |
data = new char[maxt];  | |
size = 0;  | |
    } | |
public boolean query(char letter) {  | |
put(letter);  | |
if (size < min) return false;  | |
        // StringBuilder sb = new StringBuilder(new String(data, size + 1 - min, min)); | |
StringBuilder sb = new StringBuilder(new String(data, size + 1 - min, min - 1));  | |
for (int i = min; i <= size; ++i) {  | |
sb.insert(0, data[size - i]);  | |
if (set.contains(sb.toString())) {  | |
return true;  | |
            } | |
        } | |
return false;  | |
    } | |
private void put(char c) {  | |
int cnt = data.length;  | |
if (size >= cnt) {  | |
            // 已存满 | |
            // System.arraycopy(data, 1, data, 0, cnt - 1); | |
for (int i = 0; i < cnt - 1; ++i) {  | |
data[i] = data[i + 1];  | |
            } | |
data[cnt - 1] = c;  | |
return;  | |
        } | |
data[size++] = c;  | |
    } | |
} | |
/** | |
* Your StreamChecker object will be instantiated and called as such:  | |
* StreamChecker obj = new StreamChecker(words);  | |
* boolean param_1 = obj.query(letter);  | |
*/  | 
