【每日一题Day156】LC1032字符流 | 字典树

简介: 【每日一题Day156】LC1032字符流 | 字典树

字符流【LC1032】

设计一个算法:接收一个字符流,并检查这些字符的后缀是否是字符串数组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

字典树还是比较熟练了,不熟练的快来练习

  • 思路:【字典树】
    还是字典树的老套路,题目要求是与字符流的后缀匹配,因此将words逆序加入到字典树中,然后使用StringBuilder存储字符流中的字符,每加入一个字符判断是否有其后缀字符串在字典树中存在,同样以逆序的形式判断,如果某个节点的cnt大于0,那么表示有匹配的后缀
  • 实现
class StreamChecker {
    StringBuilder sb;
    class TireNode{
        TireNode[] next = new TireNode[26];
        int cnt;
    }
    TireNode root;
    public void insert(String s){
        TireNode p = root;
        for (int i = s.length() - 1; i >= 0; i--){
            int u = s.charAt(i) - 'a';
            if (p.next[u] == null)  p.next[u] = new TireNode();
            p = p.next[u];
        }
        p.cnt++;
    }
    public StreamChecker(String[] words) {
        root = new TireNode();
        sb = new StringBuilder();
        for (String word : words){
            insert(word);
        }
    }
    public boolean query(char letter) {
        sb.append(letter);
        TireNode p = root;
        for (int i = sb.length() - 1; i >= 0; i--){
            int u = sb.charAt(i) - 'a';
            if (p.next[u] == null) return false;
            p = p.next[u];
            if (p.cnt > 0) return true;
        }
        return p.cnt > 0;
    }
}
/**
 * Your StreamChecker object will be instantiated and called as such:
 * StreamChecker obj = new StreamChecker(words);
 * boolean param_1 = obj.query(letter);
 */

image.png

目录
相关文章
|
5月前
【每日一题Day266】LC18四数之和 | 排序+双指针
【每日一题Day266】LC18四数之和 | 排序+双指针
39 1
|
5月前
【每日一题Day366】LC2103环和杆 | 状态压缩
【每日一题Day366】LC2103环和杆 | 状态压缩
43 0
|
5月前
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
45 0
|
5月前
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
35 0
|
5月前
|
存储 算法
【每日一题Day316】LC449序列化和反序列化二叉搜索树 | BFS
【每日一题Day316】LC449序列化和反序列化二叉搜索树 | BFS
41 0
|
5月前
字符串——OJ题
字符串——OJ题
72 0
|
5月前
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
41 0
|
5月前
【每日一题Day177】LC1023驼峰式匹配 | 模拟+双指针
【每日一题Day177】LC1023驼峰式匹配 | 模拟+双指针
42 0
【每日一题Day177】LC1023驼峰式匹配 | 模拟+双指针
|
5月前
|
Java Go
每日一题《剑指offer》字符串篇之字符流中第一个不重复的字符
每日一题《剑指offer》字符串篇之字符流中第一个不重复的字符
59 0
每日一题《剑指offer》字符串篇之字符流中第一个不重复的字符
|
5月前
【每日一题Day129】LC1247交换字符使得字符串相同 | 贪心
【每日一题Day129】LC1247交换字符使得字符串相同 | 贪心
46 0