设计一个算法:接收一个字符流,并检查这些字符的后缀是否是字符串数组 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。
题目链接:https://leetcode.cn/problems/stream-of-characters/
# 解题思路
暴力模拟:最多存储 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); | |
*/ |