G
N
I
D
A
O
L
  • 设计一个算法:接收一个字符流,并检查这些字符的后缀是否是字符串数组 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()) 个字符,每次存储字符前需要进行移位操作;

# 提交记录

image.png

# 代码

a
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);
 */
更新于 阅读次数

😉觉得写的还不错,请我喝杯咖啡吧😁

独步凌波 微信支付

微信支付

独步凌波 支付宝

支付宝