news 2026/2/15 8:51:49

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/2/14 6:39:34

开始开发网络版的APP

主要目的是&#xff1a;复习Django&#xff0c;因为不复习一下&#xff0c;就全都忘记了。作为app后端&#xff0c;当然要做到熟练。我们的服务器既然在国外&#xff0c;那就不用担心什么许可证的问题。还可以先上架一些有用的服务&#xff1a;比如在线文件格式转换什么的。

作者头像 李华
网站建设 2026/2/12 10:05:44

还没部署OpenClaw?2026年OpenClaw(Clawdbot)秒级部署图文步骤

还没部署OpenClaw&#xff1f;2026年OpenClaw(Clawdbot)秒级部署图文步骤&#xff01;OpenClaw(原名Clawdbot/Moltbot)是一款开源的本地优先AI代理与自动化平台。它不仅能像聊天机器人一样对话&#xff0c;更能通过自然语言调用浏览器、文件系统、邮件等工具&#xff0c;完成整…

作者头像 李华
网站建设 2026/2/13 4:19:38

OpenClaw怎么部署?2026年OpenClaw(原Clawdbot)一键部署,手把手教学

OpenClaw怎么部署&#xff1f;2026年OpenClaw&#xff08;原Clawdbot&#xff09;一键部署&#xff0c;手把手教学。OpenClaw(原名Clawdbot/Moltbot)是一款开源的本地优先AI代理与自动化平台。它不仅能像聊天机器人一样对话&#xff0c;更能通过自然语言调用浏览器、文件系统、…

作者头像 李华
网站建设 2026/2/14 8:14:53

巧妙运用Excel矩阵函数与ABS:斜角平均值计算与业绩升降分析

一、单位矩阵MUNIT函数的精妙应用 1.1 MUNIT函数简介 MUNIT函数是Excel中的矩阵函数&#xff0c;用于生成指定维度的单位矩阵。单位矩阵是一个主对角线元素为1&#xff0c;其余元素为0的方阵。 语法&#xff1a;MUNIT(dimension) 参数&#xff1a;dimension - 矩阵的维度&…

作者头像 李华
网站建设 2026/2/12 2:42:24

计算机Python毕设实战-基于python的媒体资源管理系统设计与实现多媒体素材/素材管理系统/多媒体资源管理/媒体资产管理系统/数字资产【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华