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;	// 无效返回 -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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kafka的安装与简单使用

下载地址&#xff1a;Apache Kafka 1. 上传并解压安装包 tar -zxvf kafka_2.13-3.6.2.tgz 修改文件名&#xff1a;mv kafka_2.13-3.6.2 kafka 2. 配置环境变量 sudo vim /etc/profile #配置kafka环境变量 export KAFKA_HOME/export/server/kafka export PATH$PATH:$KAFKA…

echarts性能优化

echarts数据量多的时候优化方案&#xff1a; 渲染的数据太多时&#xff0c;渲染的速度会变慢。 let data [];for (let i 0; i < 100000; i) {let style {};if (i % 2 0) {style.color "red";}data.push({value: i,itemStyle: style,}); } myEcharts init(c…

07 FreeRTOS 事件组(event group)

1、事件组概念 1.1 基本概念 使用事件组可以等待某个事件、若干事件中的任意一个事件、若干事件中的所有事件&#xff0c;但是不能指定若干事件中的某些事件。 事件组可以简单地认为就是一个整数&#xff1a;这个整数的每一位表示一个事件&#xff1b;每一位事件的含义由程序员…

【B站 heima】小兔鲜Vue3 项目学习笔记 Day06

文章目录 购物车本地1. 列表购物车基础数据渲染2. 列表购物车单选功能3. 列表购物车全选功能4. 列表购物车统计列表实现5. 接口-加入购物车6. 接口-删除购物车7. 退出登录-清空购物车数据8. 合并购物车到服务器(重要) 结算1. 路由配置和基础数据渲染2. 地址切换-打开弹框交互实…

如何选择适合自己需求的云服务器

最近明月接了一个跨境电商的代维业务&#xff0c;发现他们的云服务器很有代表性&#xff0c;今天就以此为例给大家分享一下应该如何选择适合自己需求的云服务器。像明月这样专做代维业务的可以说什么云服务器都体验过了&#xff0c;也发现大家在选择自己的云服务器的时候有很大…

大模型“1元购”?AI公司加速奔向应用端“大航海时代”

自字节跳动发布豆包大模型&#xff0c;互联网大厂纷纷就位&#xff0c;击穿“地板价”的打法从C端向B端拓展。这也成为今年“618”最亮眼的价格战。 5月15日&#xff0c;字节跳动率先宣布豆包大模型已通过火山引擎开放给企业客户&#xff0c;大模型定价降至0.0008元/千Tokens&…

解读 | 上海房地产政策松绑,售楼电话被“打爆”

图片来源千图网 自5月27日晚间上海发布房地产政策松绑消息以来&#xff0c;城市楼市气氛仿佛被一股暖流席卷&#xff0c;售楼电话几乎在一夜之间被“打爆”。这一次调整的政策涉及到多个方面&#xff0c;包括首套房首付比例的下调、二套房首付比例的调整、房贷利率的优惠等&am…

二叉树的实现

一、结构体声明和函数声明 #pragma once#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> #include<stdbool.h>//二叉树typedef char BTDataType; typedef struct BinaryT…

最新淘宝死店全自动采集私信筛选脚本,号称日赚500+【采集软件+使用教程】

原理&#xff1a; 利用脚本自动采集长时间未登录店铺&#xff0c;然后脚本自动私信对应的店铺&#xff0c;看看商家是不是不回消息来判断是否是死店&#xff0c;再下单购买死店的产品&#xff0c;超过48小时不发货就可以联系客服获得赔付&#xff0c;一单利润百分之5%-30%&…

STP19NF20 丝印 19NF20 场效应管19A 200V 直插 TO-220

STP19NF20 功率MOSFET的应用领域相当广泛&#xff0c;主要包括&#xff1a; 1. 电源管理&#xff1a;用于高效率电源管理电路&#xff0c;如直流-直流转换器和交流-直流电源适配器。 2. 开关模式电源&#xff08;SMPS&#xff09;&#xff1a;在需要高效能和紧凑型尺寸的开关…

【数据结构】二叉树的链式结构

目录 一.二叉树的遍历 1.前序遍历 2.中序遍历 3.后序遍历 4.层序遍历 二.二叉树查询的基本操作 1.二叉树节点的个数 2.二叉树叶子节点的个数 3.二叉树的高度 4.二叉树第k层节点的个数 5.二叉树查询值为x的节点 6.判断二叉树是否为完全二叉树 7.二叉树基础oj练习 三…

【Python编程实践2/3】Python图像处理模块(上)

目录 引言 目标 安装模块 Windows系统 macOS系统 路径 Windows路径 ​编辑macOS路径 windows路径报错 windows路径前的r 示例代码 windows快速查看路径 macOS快速查看路径 打开图片 展示图片 下节预告 总结 引言 欢迎各位大佬垂阅本篇Python实践博客&a…

一文读懂python同级目录的调用附Demo(详细解读)

目录 前言1. 问题所示2. 原理分析3. 解决方法3.1 添加父目录3.2 相对路径3.3 添加init 前言 通过制作简易的Demo&#xff0c;让其更加深入的了解如何使用 1. 问题所示 发现python的同级目录相互调用会出Bug E:\software\anaconda3\envs\py3.10\python.exe F:\python_project…

python之生成xmind

今天为啥要说这个呢&#xff0c;因为前几天做接口测试&#xff0c;还要写测试用例&#xff0c;我觉得麻烦&#xff0c;所以我就用了python里面xmind的插件。自动生成了测试用例&#xff0c;数据来源是json。 &#x1f366; 第一步安装 pip install xmind &#x1f366; 第二…

01_Spring Ioc(详解) + 思维导图

文章目录 思维导图一.概念实操Maven父子工程 二. IOC和DI入门案例【重点】1 IOC入门案例【重点】问题导入1.1 门案例思路分析1.2 实现步骤2.1 DI入门案例思路分析2.2 实现步骤2.3 实现代码2.4 图解演示 三、Bean的基础配置问题导入问题导入1 Bean是如何创建的【理解】2 实例化B…

【408真题】2009-26

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

Camunda BPM主要组件

Camunda BPM是使用java开发的,核心流程引擎运行在JVM里,纯java库,不依赖其他库或者底层操作系统。可以完美地与其他java框架融合,比如Spring。除了核心流程引擎外,还提供了一系列的管理,操作和监控工具。 1,工作流引擎 既适用于服务或者微服务编排,也适用于人工任务管…

VBA技术资料MF159:实现某个区域内的数据滚动

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

详解 Spark 的运行架构

一、核心组件 1. Driver Spark 驱动器节点&#xff0c;用于执行 Spark 任务中的 main 方法&#xff0c;负责实际代码的执行工作主要负责&#xff1a; 将用户程序转化为作业 (job)在 Executor 之间调度任务 (task)跟踪 Executor 的执行情况通过 UI 展示查询运行情况 2. Exec…

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/> <…