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

力扣395做题笔记

题目链接

力扣395

第一次尝试

class Solution {public int longestSubstring(String str, int k) {char[] s = str.toCharArray();int n = s.length;int[] cnts = new int[256];int ans = 0;for (int r = 0, l = 0; r < n; r ++) { cnts[s[r]]++;if (cnts[s[r]] >= k) { ans = Math.max(ans, r - l + 1);// l = r + 1;}}return ans;}
}

结果遇到这个样例:

输入
s ="ababacb" k =3输出
7
预期结果
0

题目强调的是该子串里面的每一种字符都要大于k,我的写法错误地理解为只要有一种大于k的子串就行了。

左神解法

这里利用了一点动态规划的思想,这个字符串都是小写的字符串。
在这里插入图片描述
那么就说明,最多有26种字符来组合一个字符串。那么我们从1分析到26,找出子串含有1~26种,每种符合的长度,然后比长短既可以了。
相当于就26种子问题,组合一起就是总问题了。

class Solution {public int longestSubstring(String str, int k) {char[]s = str.toCharArray();int[] cnts = new int[256];int n = s.length;int ans = 0;//collect 当前窗口收集到的字符种类数//satisfy 当前窗口满足条件的种类的数量for (int require = 1; require <= 26; require ++) { Arrays.fill(cnts, 0);for (int r = 0, l = 0, collect = 0, satisfy = 0; r < n; r ++) { cnts[s[r]]++;if (cnts[s[r]] == 1) { collect++;}if (cnts[s[r]] == k) { satisfy++;}//处理种数超过require的情况while (collect > require) {if (cnts[s[l]] == k) { satisfy --;}if (cnts[s[l]] == 1) { collect --;}cnts[s[l++]]--;}//合规,更新答案if (collect == satisfy) {ans = Math.max(ans, r - l + 1);}}}return ans;}
}

我们要看当前窗口收集了多少种类,要控制它不能超过当前处理的子问题(require)的数量,否则就是不合规的,因为它应该在处理之后的子问题才考虑。

  1. 关于窗口收集了多少种类这个问题,我最开始是想找一个哈希表,之类的结构来判断这个窗口已经存了几种字符了,其实没必要,如果有新的种类进入窗口,说明它的数量初始为0,一加完变成了一,这样就说明它是一个新的类型,就要给collect进行增加。
                cnts[s[r]]++;if (cnts[s[r]] == 1) { collect++;}
  1. 关于窗口合规的种类,还要一个变量satisfy来确定当前窗口符合要求的字符的个数,一旦collect == satisfy就说明,我们当前require种字符出现次数都满足了大于等于k的要求了,那么就可以更新答案了。思想和1一样,一个字符加完了之后刚好等于k,不就说明,我们多了一种符合要求的字符吗?所以令satisfy增加
                if (cnts[s[r]] == k) { satisfy++;}
  1. 如果超过了require的情况
    那么就要考虑缩减窗口,同时要判断有没有导致collct和satisfy的变化。
              //处理种数超过require的情况while (collect > require) {if (cnts[s[l]] == k) { satisfy --;}if (cnts[s[l]] == 1) { collect --;}cnts[s[l++]]--;}
  1. 最后更新返回答案即可
                if (collect == satisfy) {ans = Math.max(ans, r - l + 1);}
http://www.xdnf.cn/news/8786.html

相关文章:

  • 深度学习论文idea:多模态检索
  • 计算机网络总结(物理层,链路层)
  • 【深度学习】2. 从梯度推导到优化策略:反向传播与 SGD, Mini SGD
  • 最好用的wordpress外贸主题
  • 【概率论基本概念02】最大似然性
  • 正则表达式:字符串模式匹配的利器
  • Bochs下去运行linux-0.11
  • 云原生安全基石:深度解析HTTPS协议(从原理到实战)
  • 图论核心:深度搜索DFS 与广度搜索BFS
  • 【React】createPortal - 简单的Message和Modal组件
  • JAVA集合(含List、Map、Set)(超详细版)
  • 阿里云国际版香港轻量云服务器:CN2 GIA加持,征服海外网络的“速度与激情”!
  • 搭建 C/C++_CMake_Boost_git 开发环境
  • 【最新版】Arduino IDE的安装入门Demo
  • 异步编程与axios技术
  • 代码随想录算法训练营 Day53 图论Ⅳ 字符串接龙 有向图 岛屿周长
  • C#索引器详解:让对象像数组一样被访问
  • 自用git记录
  • Java反射机制详细笔记
  • 项目管理学习-CSPM4(2)
  • 代码随想录第42天:图论3
  • 嵌入式硬件---施密特触发器单稳态触发器多谐振荡器
  • 【Excel VBA 】窗体控件分类
  • 【TDengine源码阅读】举例说明pthread_once_t和PTHREAD_ONCE_INIT
  • STM32 输出比较输出PWM控制呼吸灯小实验(2种实现 铁头山羊与江协科技)
  • Ansible安装
  • C++面向对象编程实战:继承与派生全解析
  • A2A与MCP:差异、协同及企业级应用解析
  • 实战设计模式之访问者模式
  • Javase 基础加强 —— 07 File