news 2026/4/16 12:42:27

D.二分查找-二分答案-求最大——2982. 找出出现至少三次的最长特殊子字符串 II

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
D.二分查找-二分答案-求最大——2982. 找出出现至少三次的最长特殊子字符串 II

题目链接:2982. 找出出现至少三次的最长特殊子字符串 II(中等)

算法原理:

解法:二分查找

98ms击败51.14%

时间复杂度O(Nlogn)

核心思路,我们可以通过顺序表数组,把各个字母的各个连续段长度存起来,通过二分查找找到符合的子串长度

①目标变量:子串长度

②目标条件:s中出现≥3次的最长特殊子字符串长度

③转换逻辑:当前子串长度mid下,能否有≥3次的最长特殊子字符串

具体步骤:

①确定区间边界:

left:0

right:s的长度

②确定二分模型:由于要找最长的特殊子串长度,找最长用最右端点模型,如果当前mid长度下不能凑出≥3次的最长特殊子字符串长度,说明mid太大了,应该向左调整,变小点以便适应更多次数,也就是说呈负相关单调:子串长度↑ 目标条件符合度↓

③check方法设计:

1.如果mid为0,说明一定为不能凑出特殊子串,直接返回false

2.遍历每个小写字母,看看每段的长度能否凑出来

遍历过程中如果遇到空表,直接跳过

如果这段比mid小,就跳过找下一段

比mid大就累加这段的贡献量,由于特殊子串连续,贡献量长度+1-mid

比如mid=3,该段=5,那么这段可以是123、234、345共3段,正好是5+1-3=3,对的上

如果凑不出就返回true,向左调整mid

Java代码:

class Solution { private static List<Integer>[] groups; public int maximumLength(String ss) { //统计每个字符的连续长度 char[] s=ss.toCharArray(); groups=new ArrayList[26]; Arrays.setAll(groups,_->new ArrayList<>()); int count=0; for(int i=0;i<s.length;i++){ count++; if(i+1==s.length||s[i]!=s[i+1]){ //把这一段的长度添加进去 groups[s[i]-'a'].add(count); //重新计数 count=0; } } //二分框架 int left=0,right=s.length; while(left<right){ int mid=left+(right-left+1)/2; if(check(mid)) right=mid-1; else left=mid; } //如果所有都不能凑出就返回-1 return check(left)?-1:left; } //判断能否存在某个字符,能凑出至少3个长度为mid的相同子串 //若不能凑出,则返回true向左调整mid private boolean check(int mid){ if(mid==0) return true; //遍历每个小写字母,看看每段的长度能否凑出来 for(List<Integer> word:groups){ //该字符无连续段,直接跳过 if(word.isEmpty()) continue; //统计该字符当前段能凑出mid长度子串的总数 int sum=0; for(int l:word){ if(l<mid) continue; sum+=l+1-mid;//累加该段的贡献量 if(sum>=3) return false; } } return true; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/20 11:21:13

重启解决手机信号差?别只知其一不知其二,这些细节决定成败

手机信号突差让人困扰&#xff0c;重启虽常有效&#xff0c;但很多人重启多次仍无效&#xff0c;核心是忽略了关键细节、未掌握配套操作。本文盘点重启的关键细节及辅助技巧&#xff0c;全程无营销&#xff0c;适配所有手机用户&#xff0c;帮你提升重启效果。 关键细节一&…

作者头像 李华
网站建设 2026/4/6 11:17:24

第九篇:特别篇 - 给医院CIO的技术采购指南

副标题&#xff1a;如何在招标文件中避开那些“美丽的陷阱”&#xff1f;引言&#xff1a;当技术采购遇上“艺术性描述”在医院数字化转型升级的关键时期&#xff0c;技术采购直接关系到医疗服务的质量和效率。然而&#xff0c;许多医院CIO在招标过程中都曾遭遇过那些“听起来很…

作者头像 李华
网站建设 2026/4/16 4:30:27

什么是PD快充诱骗芯片?以及它是如何从充电器取电5V9V12V15V20V

什么是快充诱骗芯片 快充诱骗芯片是一种用于受电设备端的协议转换芯片&#xff0c;核心作用是与快充充电器完成协议握手&#xff0c;主动请求并 “诱骗” 其输出预设的高压档位&#xff08;如 9V/12V/15V/20V/ 28V&#xff09;&#xff0c;从而获取超出默认5V的供电能力。用电器…

作者头像 李华
网站建设 2026/4/8 5:35:36

Mysql数据库导入时几种编码格式的不同

结论&#xff1a;选用936936&#xff08;ANSI/OEM - Simplified Chinese GBK &#xff09; - 含义&#xff1a;936 是代码页编号&#xff0c;对应 GBK 编码 。GBK即《汉字内码扩展规范》 &#xff0c;是在国家标准GB2312基础上扩容后兼容GB2312的标准。 - 特点&#xff1a;采用…

作者头像 李华
网站建设 2026/4/16 10:22:36

OpenClaw 和 Claude Code

总结OpenClaw 和 Claude Code 没有官方关系。 OpenClaw 是社区项目&#xff0c;目标是“复刻 / 替代 Claude Code 的体验”。 它们是&#xff1a;灵感来源 使用场景高度相似&#xff0c;而不是同一个体系。一、Claude Code 是什么&#xff1f;Anthropic 官方专门为 Claude 模型…

作者头像 李华