当前位置: 首页 > news >正文

【每日一题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);*/
    
    • 复杂度
      • 时间复杂度:insert的时间复杂度为O(n)O(n)O(n)nnn为字符串的长度,StreamChecker的时间复杂度为O(mn)O(mn)O(mn)mmm为字符串的大小,query的时间复杂度为O(d)O(d)O(d)ddd为字典树的大小
      • 空间复杂度:O(d)O(d)O(d)
http://www.lryc.cn/news/42281.html

相关文章:

  • V2G模式下含分布式能源网优化运行研究(Matlab代码实现)
  • 手写一个简单的RPC框架
  • 【剑指offer】旋转数组的最小数字
  • 【Dorker】Portainer轻量级可视化工具
  • 基于 vue.js 进行组件封装的方案
  • 【Unityc#专题篇】之c#基础篇
  • Python(白银时代)——模块、包、异常
  • 小程序和Vue写法的区别
  • 如何实现分布式锁
  • 使用VS2019连接Microsoft SQL Server Compact 4.0数据库
  • Vue2 和 Vue3 的对比
  • [数据结构]二叉树的链式存储结构
  • 黑马程序员 Redis 踩坑及解决
  • Matlab实现粒子群算法
  • tailwindcss 写原生html
  • Java开发一年不到,来面试居然敢开口要20K,面完连8K都不想给~
  • LeetCode题解 20(17,79) 电话号码的字母组合,单词搜索<回溯>
  • 路径之谜 蓝桥杯 89
  • Mysql数据库如何调优
  • CAN(FD)记录仪在新能源汽车整车控制器(VCU)、电池管理系统(BMS)、电机控制器(MCU)、发动机ECU中的应用,免去出差烦恼
  • 【设计模式】23种设计模式之七大原则
  • python - 文件操作
  • docker打包golang应用
  • redis 内容总结
  • 贪心算法(一)
  • 【栈和队列OJ题】有效的括号用队列实现栈用栈实现队列设计循环队列
  • kuernetes 资源对象分析报错
  • 动态内存的开辟
  • 【蓝桥杯-筑基篇】搜索
  • week5-质数-最大公约数-快速幂-组合计数-博弈论