Day 6:2981. 找出出现至少三次的最长特殊子字符串 I

Leetcode 2981. 找出出现至少三次的最长特殊子字符串 I

给你一个仅由小写英文字母组成的字符串 s 。

如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串 “abc” 不是特殊字符串,而字符串 “ddd”、“zz” 和 “f” 是特殊字符串。

返回在 s 中出现 至少三次最长特殊子字符串的长度,如果不存在出现至少三次的特殊子字符串,则返回 -1 。

子字符串 是字符串中的一个连续 非空 字符序列。

image.png

首先需要明确两个概念:

  • 特殊字符串:只有单一字符组成的字符串。
  • 出现:这里是可以是可以重复,比如 “aaa”,出现两次是:前两个字符一次,后两个字符一次。

对于一个长度为 n 的特殊字符串:

  • 出现一次的最长长度为 n;
  • 出现两次的最长长度为 n - 1;
  • 出现三次的最长长度为 n - 2;
  • 出现 m 次的最长长度为 n -m - 1 (m < n)。

出现三次的特殊字符串,最理想的情况,是这个特殊字符串出现字符串中的三处地方(中间是有其他字符隔开的),比如 “aabaabaa”,那么就可以提取每段,就是出现三次,这种情况下最长长度就是每段出现一次,最长长度就是最短的那段的长度。
但是并不是分为三段,也有可能是两段,这时,要想获得最长长度,让更长的那段中出现两次,更短的那段出现一次。
当然还有一种情况就是只有一段,那么就必须让这段出现三次才能获取到最长长度。

字符串中会出现多段:

  • 如果考虑只在一段中找到最长长度,最长长度是 n - 2,那选择在最长的那段中找到;
  • 如果考虑在两段中找到最长长度,最长长度是让更长的那段出现两次 n - 1,另一段出现一次 n,那选择最长的两段中找到结果;
  • 如果考虑在三段中找到最长长度,最长长度就是每段出现一次,最长长度就是最短那段的长度;
  • 如果考虑在大于三段中找到最长长度,选择其中的三段进行考虑,那么就是选择最长的三段考虑得到最长长度。因此,只需要保存最长三段的长度即可。

有三段,可能考虑三段不是最优结果,也有可能考虑两段的时候结果更好哟!!也有可能是一段哟!!!

用一个数组保存每个字母每段的长度,题中说明字符串都是小写字母,并且只需要保存最长的三段(保持递增更好计算哦),因此使用一个 26 * 4 的数组(保存最长的三段使用 *4 的原因后续说明)。

首先统计每段特殊字符串的长度,一个字符也需要考虑哦:

int i = 0
while (i < len) {int cnt = 1;  // 特殊字符串长度char c = s.charAt(i);while ((i < len - 1) && (s.charAt(i + 1) == c)) {i++;cnt++;}i++;
}

保存数据,每次将数据插入到最后一个位置,从后往前冒泡使其放入正确的位置保持递增,因此才使用 *4。

// 冒泡排序插入
list[c - 'a'][3] = cnt;
for (int j = 2; j >= 0; j--) {if (list[c - 'a'][j] < list[c - 'a'][j + 1]) {int tmp = list[c - 'a'][j + 1];list[c - 'a'][j + 1] = list[c - 'a'][j];list[c- 'a'][j] = tmp;} else {break;}
}

最后传入每个字母组成的的特殊字符串数组,进行判断得到最长长度

/*** 一个长度为 n 的字符串* 出现一次最长长度为 n* 出现两次最长长度为 n - 1* 出现三次最长长度为 n - 2*/
public int maxLength(int[] list) {if (list[0] == 0) return -1;	// 字母没有出现int res = list[0] - 2;	// 考虑一段if (list[1] != 0) {		// 考虑两段int tmp = list[0] - 1;tmp = Math.min(tmp, list[1]);res = Math.max(tmp, res);}if (list[2] != 0) {		// 考虑三段res = Math.max(res, list[2]);}if (res <= 0) return -1;	// 无效返回 -1return res;
}

完整代码:

class Solution {public int maximumLength(String s) {int[][] list = new int[26][4];  int len = s.length();int i = 0;while (i < len) {int cnt = 1; // 特殊字符串长度char c = s.charAt(i);while ((i < len - 1) && (s.charAt(i + 1) == c)) {i++;cnt++;}i++;// 冒泡排序插入list[c - 'a'][3] = cnt;for (int j = 2; j >= 0; j--) {if (list[c - 'a'][j] < list[c - 'a'][j + 1]) {int tmp = list[c - 'a'][j + 1];list[c - 'a'][j + 1] = list[c - 'a'][j];list[c- 'a'][j] = tmp;} else {break;}}}int res = -1;for (i = 0; i < 26; i++) {res = Math.max(res, maxLength(list[i]));}return res;}/*** 一个长度为 n 的字符串* 出现一次最长长度为 n* 出现两次最长长度为 n - 1* 出现三次最长长度为 n - 2*/public int maxLength(int[] list) {if (list[0] == 0) return -1;int res = list[0] - 2;if (list[1] != 0) {int tmp = list[0] - 1;tmp = Math.min(tmp, list[1]);res = Math.max(tmp, res);}if (list[2] != 0) {res = Math.max(res, list[2]);}if (res <= 0) return -1;return res;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

性能猛兽:OrangePi Kunpeng Pro评测!

1.引言 随着物联网和嵌入式系统的不断发展&#xff0c;对于性能强大、资源消耗低的单板计算机的需求也日益增加。在这个快节奏的技术时代&#xff0c;单板计算机已成为各种应用场景中不可或缺的组成部分&#xff0c;从家庭娱乐到工业自动化&#xff0c;再到科学研究&#xff0…

差分曼彻斯特编码详解

这是一种双向码&#xff0c;和曼彻斯特编码不同的是&#xff0c;这种码元中间的电平转换边只作为定时信号&#xff0c;不表示数据。数据的表示在于每一位开始处是否有电平转换&#xff1a;有电平转换则表示0&#xff0c;无则表示1。然后这就出现一个问题&#xff0c;很多小伙伴…

App Inventor 2 低功耗蓝牙BLE 两种通信方式:扫描和广播

低功耗蓝牙&#xff0c;也称为蓝牙 LE 或简称 BLE&#xff0c;是一种类似于经典蓝牙的新通信协议&#xff0c;不同之处在于它旨在消耗更少的功耗&#xff0c;同时保持可比的功能。 因此&#xff0c;低功耗蓝牙是与耗电资源有限的物联网设备进行通信的首选。BluetoothLE 扩展需…

DiffBIR论文阅读笔记

这篇是董超老师通讯作者的一篇盲图像修复的论文&#xff0c;目前好像没看到发表在哪个会议期刊&#xff0c;应该是还在投&#xff0c;这个是arxiv版本&#xff0c;代码倒是开源了。本文所指的BIR并不是一个single模型对任何未知图像degradation都能处理&#xff0c;而是用同一个…

数据结构(十)图

文章目录 图的简介图的定义图的结构图的分类无向图有向图带权图&#xff08;Wighted Graph&#xff09; 图的存储邻接矩阵&#xff08;Adjacency Matrix&#xff09;邻接表代码实现 图的遍历深度优先搜索&#xff08;DFS&#xff0c;Depth Fisrt Search&#xff09;遍历抖索过程…

【搜索方法推荐】高效信息检索方法和实用网站推荐

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

同时执行多个python脚本扫描,报如下错误,原因为文件越大读取到内存占用内存越多。

killed nohup python $file unable to fork process cannot allocate memory ls: error while loading shared libraries: libdl.so.2 failed to map segment from shared object cannot allocate memory python进程被系统或者某个用户通过 kill 命令强制终止了

Springboot 实战运用

一&#xff0c;基本配置 1&#xff0c;pom文件配置介绍 1.1继承 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.2</version><relativePath/> <…

ubuntu下载离线软件包及依赖

目录 一、前言 二、正文 1.准备环境 2.开始下载 3.后续工作 三、总结 一、前言 由于给客户提供的设备机不允许上网&#xff0c;那么所有待安装的软件包及依赖库都需要提前下载好&#xff0c;然后通过局域网传过去再安装。 另外&#xff0c;软件包可能还依赖其他的库&…

Mac安装tomcat

代码 brew install tomcat 运行结果如下&#xff1a; 如果要启动输入&#xff1a; brew services start tomcat

新书推荐—华为HCIA路由交换技术实战

新书推荐—华为HCIA路由交换技术实战 由HCIE认证讲师、技术能手、ICT大赛优秀指导教师、教学名师、国家规划教材作者联袂编撰&#xff0c;让学习不再是“硬”茬&#xff0c;而是“嗨”起来&#xff01; 《华为HCIA路由交换技术实战》 作者黄君羡组编正月十六工作室书号978-7-12…

半个月获邀请函|在读博士公派新加坡南洋理工大学联合培养

J同学计划先申报CSC联培博士&#xff0c;如若获批&#xff0c;再走本校的联培资助项目。我们仅用半个月时间&#xff0c;就为其申请到新加坡南洋理工大学&#xff0c;因导师接收名额有限制&#xff0c;其又热心推荐了另一位指导导师&#xff0c;最终J同学如愿获得学校资助出国联…

职校老师的工资待遇怎么样

工资水平一直是教师们关注的焦点&#xff0c;毕竟&#xff0c;工资不仅关系到个人的生活品质&#xff0c;还影响着教师的职业满意度和工作动力。职校教师的工资待遇究竟是怎样的呢&#xff1f; 职校教师的工资水平受多种因素影响&#xff0c;包括地区、学校类型、个人资历和教学…

备份服务器的安全风险以及如何通过TDE透明加密提升安全性

备份服务器的潜在安全风险主要包括以下几个方面&#xff1a; 1. 数据泄露风险&#xff1a; 备份数据可能包含敏感信息&#xff0c;如用户个人信息、商业机密等。如果备份数据未经适当保护&#xff0c;例如存储在不安全的位置或未加密&#xff0c;黑客或未授权的人员可能会获取…

AppInventor2 表格布局的外面的黑框怎么去掉?

问&#xff1a;表格布局的外面的黑框怎么去掉啊&#xff1f; 答&#xff1a;这个黑框是界面设计的布局位置示意&#xff0c;实际 App 测试时并没有框。 来源&#xff1a;AppInventor2 表格布局的外面的黑框怎么去掉&#xff1f; - App应用开发 - 清泛IT社区&#xff0c;为创新…

ELT 同步 MySQL 到 Doris

如何基于 Flink CDC 快速构建 MySQL 到 Doris 的 Streaming ELT 作业&#xff0c;包含整库同步、表结构变更同步和分库分表同步的功能。 本教程的演示都将在 Flink CDC CLI 中进行&#xff0c;无需一行 Java/Scala 代码&#xff0c;也无需安装 IDE。 准备阶段 # 准备一台已经…

vscode中更改 git托管的项目里的文件 不显示在 修改项 changes里面

目录 一、问题 二、原因及解决方法 三、总结 tiips:如嫌繁琐&#xff0c;直接移步总结即可&#xff01; 一、问题 1.在vscode中修改 从 git拉取下来的代码&#xff0c;本地不显示被修改的文件&#xff1b;文件夹只有最外层显示红色修改图标;但是里面的被修改的文件也没有被…

IO系列(十) -TCP 滑动窗口原理解析

一、摘要 之前在知乎上分享网络编程知识文章的时候&#xff0c;有个网友私信给我留言了一条“能不能写一篇关于 TCP 滑动窗口原理的文章”。 当时没有立即回复&#xff0c;经过查询多方资料&#xff0c;发现这个 TCP 真的非常非常的复杂&#xff0c;就像一个清澈的小沟&#…

怎么将3D模型转换立面图---模大狮模型网

在建筑设计、室内设计以及产品建模等领域&#xff0c;经常需要将3D模型转换为立面图以进行展示、分析或交流。立面图能够清晰地呈现物体的外观和结构&#xff0c;是设计和施工中不可或缺的一部分。 一、导出3D模型 首先&#xff0c;需要将3D模型导出为CAD软件能够识别的格式。…

第十九节:带你梳理Vue2: 父组件向子组件传参(props传参)

1. 组件嵌套 1.1 组件的嵌套使用 之前有说过,Vue组件跟Vue实例是一样的,因此在Vue中一个组件中也可以定义并使用自己的局部组件,这就是组件的嵌套使用 例如:示例代码如下: <div id"app"><!-- 3. 使用组件 --><my-component></my-component&…