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

news2024/11/23 22:11:22

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;	// 无效返回 -1
    return 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.coloradmin.cn/o/1714700.html

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

相关文章

计算字符串的长度

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 由于不同的字符所占字节数不同&#xff0c;所以要计算字符串的长度&#xff0c;需要先了解各字符所占的字节数。在Python中&#xff0c;数字、英文、…

万亿应急国债项目之通信指挥类应急装备多链路聚合通信设备在应急行业中的重要作用

万亿应急国债项目的推出&#xff0c;无疑是我国在应急领域的一次重大举措。在这一宏大蓝图中&#xff0c;通信指挥类应急装备的多链路聚合通信设备显得尤为重要&#xff0c;其在应急行业中所发挥的作用&#xff0c;堪称不可或缺的关键一环。 通信指挥是应急响应中的核心环节&a…

【开源项目】Excel数据表自动生成工具v1.0版

一、介绍 Excel数据表自动生成工具是Go语言编写的一款小型工具软件&#xff0c;用于将特定的Excel表格内容导出为多种编程语言的代码或可以直接读取的数据内容。 开源Github地址&#xff1a;https://github.com/SkyCreator/goproj 二、版本v1.0功能概览 1.编程语言支持 目前…

ch2应用层--计算机网络期末复习

2.1应用层协议原理 网络应用程序位于应用层 开发网络应用程序: 写出能够在不同的端系统上通过网络彼此通信的程序 2.1.1网络应用程序体系结构分类: 客户机/服务器结构 服务器: 总是打开(always-on)具有固定的、众所周知的IP地址 主机群集常被用于创建强大的虚拟服务器 客…

【漏洞复现】大华智能物联综合管理平台 fastjson远程代码执行漏洞

0x01 产品简介 大华ICC智能物联综合管理平台对技术组件进行模块化和松耦合&#xff0c;将解决方案分层分级&#xff0c;提高面向智慧物联的数据接入与生态合作能力。 0x02 漏洞概述 由于大华智能物联综合管理平台使用了存在漏洞的Fastson组件,未经身份验让的攻击者可利用 /e…

探索Codigger文件管理器(File Explorer)的创新与实用性

在数字时代&#xff0c;文件资源管理器作为桌面环境中不可或缺的一部分&#xff0c;承担着管理文件和文件夹的重要职责。Codigger文件管理器&#xff08;File Explorer&#xff09;以其独特的创新和实用性&#xff0c;为用户提供了高效、便捷的文件管理体验。 Codigger文件管理…

AVL树的模拟实现

我们上期提到了二叉搜索树&#xff0c;只是简单的讲了一下原理&#xff0c;那么今天我们就讲一下AVL树。 目录 AVL树的概念AVL树的实现AVL树的架构insert插入引用pair对象引进parent指针仅插入数据调节平衡因子情况1&#xff1a;插入在父亲的右边&#xff0c;父亲的平衡因子后…

一种最大重叠离散小波包特征提取和支持向量机的ECG心电信号分类方法(MATLAB 2018)

目前小波分析算法常采用Mallat快速算法。该算法由与滤波器卷积、隔点采样和隔点插零等三个环节组成。由于实际使用的滤波器并不具有理想频域特性&#xff0c;使得在标准二进小波算法中存在着频率混叠和小波系数失真等缺点&#xff0c;在标准二进小波包算法中还存在频带错乱现象…

docker制作高版本jdk17镜像踩坑

1、创建目录并下载jdk上传到服务器中 从jdk官网下载jdk17镜像&#xff0c;提示&#xff1a;下载到本地用xftp上传到服务器&#xff08;速度会快点&#xff09; jdk官网&#xff1a;https://www.oracle.com/java/technologies/downloads/#graalvmjava21 创建目录&#xff0c;将…

MATLAB分类与判别模型算法:基于Fisher算法的分类程序【含Matlab源码 MX_002期】

算法思路介绍&#xff1a; 费舍尔线性判别分析&#xff08;Fishers Linear Discriminant Analysis&#xff0c;简称 LDA&#xff09;&#xff0c;用于将两个类别的数据点进行二分类。以下是代码的整体思路&#xff1a; 生成数据&#xff1a; 使用 randn 函数生成随机数&#x…

P10-P11【重载,模板,泛化和特化】【分配器的实现】

三类模板&#xff08;类模板&#xff09;&#xff08;函数模板&#xff09;&#xff08;成员函数模板&#xff09; 特化 偏特化&#xff1a;模板参数个数/模板范围 定义的分配器 以上分配器的性能和内存管理有很大不足&#xff08;在分配内存时&#xff0c;会产生很大的内存开…

UE5中绘制饼状图

饼状图 使用UE绘制前提完整的创建过程123456678 附录代码.h代码.c代码 使用UE绘制前提 EPIC Game使用的版本是Unreal Engine 5.0.3。 没有使用其他额外的插件&#xff0c;使用的是C和Ui共同绘制。 C编译器使用的是VS2019。 完整的创建过程 1 首先在UE中随意一种项目的白色。…

博物馆三维实景vr展示

VR技术应用到地产行业的优势不言而喻&#xff0c;随着购房政策的进一步放宽&#xff0c;购房刚需者借助VR商铺样板间展示系统看房&#xff0c;远比之前跑楼盘更便捷高效。那么VR商铺全景展示具体有哪些好处呢? VR技术与商铺的结合&#xff0c;为客户带来了前所未有的购房体验。…

python基础知识总结(第一节)

一、python简介&#xff1a; Python是一种解释型&#xff0c;面向对象的高级语言。 Pyhton的语法和动态类型&#xff0c;以及解释性语言的本质&#xff0c;使它一跃成为多数平台上写脚本和快速开发应用的编程语言。 python语言百度百科介绍 二、Python基础语法&#xff1a;…

国产操作系统上apt命令详解 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上apt命令详解 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上使用apt命令的详解文章。apt&#xff08;Advanced Package Tool&#xff09;是Debian及其衍生发行版&#xff08;如统信UOS…

宁盾身份域管与天翼云电脑完成兼容互认证

近日&#xff0c;宁盾身份域管与天翼云电脑完成兼容互认证&#xff01;这是继中兴、深信服、升腾威讯云桌面/云电脑后&#xff0c;宁盾对接的第4个国产云桌面品牌。企业在引入国产云桌面时&#xff0c;同时会考虑微软AD目录的替代方案。宁盾国产化身份域管对接天翼云电脑从终端…

521源码-免费手游下载-【烽火中原H5】深度体验:横版网页国战手游及WIN学习手工端

【烽火中原H5】深度体验&#xff1a;横版网页国战手游及WIN学习手工端全面解析,烽火中原H5】横板网页国战手游WIN学习手工端语音视频教程营运后台CDK授权后台, 喜欢国战手游的玩家们&#xff0c;你们期待已久的【烽火中原H5】现已上线&#xff01;这款游戏以横版网页的形式呈现…

[LitCTF 2023]yafu (中级) (素数分解)

题目&#xff1a; from Crypto.Util.number import * from secret import flagm bytes_to_long(flag) n 1 for i in range(15):n *getPrime(32) e 65537 c pow(m,e,n) print(fn {n}) print(fc {c})n 152412082177688498871800101395902107678314310182046454156816957…

电商推荐系统+电影推荐系统【虚拟机镜像分享】

电商推荐系统电影推荐系统【虚拟机镜像分享】 所有组件部署好的镜像下载&#xff08;在下面&#xff09;&#xff0c;仅供参考学习。&#xff08;百度网盘&#xff0c;阿里云盘…&#xff09; 博主通过学习尚硅谷电商推荐电影推荐项目&#xff0c;将部署好的虚拟机打包成ovf文…

横截面分位数回归

一、分位数回归简介 分位数回归&#xff08;英语&#xff1a;Quantile regression&#xff09;是回归分析的方法之一。最早由Roger Koenker和Gilbert Bassett于1978年提出。一般地&#xff0c;传统的回归分析研究自变量与因变量的条件期望之间的关系&#xff0c;相应得到的回归…