Leetcode2982. 找出出现至少三次的最长特殊子字符串 II

news2024/11/17 21:33:52

Every day a Leetcode

题目来源:2982. 找出出现至少三次的最长特殊子字符串 II

解法1:字符串分割 + 分类讨论

按照相同字母分组,每组统计相同字母连续出现的长度。例如 aaaabbbabb 把 a 分成一组,组内有长度 4 和长度 1;把 b 分成一组,组内有长度 3 和长度 2。

单独考虑每一组,按照长度从大到小排序,设长度列表为 group。

分类讨论:

  1. 从最长的特殊子串(group[0])中取三个长度均为 group[0]−2 的特殊子串。例如示例 1 的 aaaa 可以取三个 aa。
  2. 从最长和次长的特殊子串(group[0]、group[1])中取三个长度一样的特殊子串:min⁡(group[0]−1, group[1])。
  3. 从最长、次长、第三长的的特殊子串(group[0]、group[1]、group[2])中各取一个长为 group[2]的特殊子串。

这三种情况取最大值,即:max({group[0] - 2, min(group[0] - 1, group[1]), group[2]})。取每一组的最大值,即为答案。

如果答案是 0,返回 −1。

代码实现时,无需特判 group 数组长度小于 3 的情况,我们只需要在数组添加两个空串(在数组末尾加两个 0)即可。

代码:

/*
 * @lc app=leetcode.cn id=2981 lang=cpp
 *
 * [2982] 找出出现至少三次的最长特殊子字符串 II
 */

// @lc code=start
class Solution
{
public:
    int maximumLength(string s)
    {
        // 特判
        if (s.empty())
            return 0;

        vector<int> groups[26];
        int n = s.length();
        int count = 0;
        for (int i = 0; i < n; i++)
        {
            count++;
            if (i + 1 == n || s[i] != s[i + 1])
            {
                groups[s[i] - 'a'].push_back(count); // 统计连续字符长度
                count = 0;
            }
        }

        int ans = 0;
        for (vector<int> &group : groups)
        {
            if (group.empty())
                continue;
            // 降序排序
            sort(group.begin(), group.end(), greater<int>());
            // 假设还有两个空串
            group.push_back(0);
            group.push_back(0);
            ans = max({ans, group[0] - 2, min(group[0] - 1, group[1]), group[2]});
        }
        return ans == 0 ? -1 : ans;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(nlogn),其中 n 是字符串 s 的长度。

空间复杂度:O(n),其中 n 是字符串 s 的长度。

解法2:字符串分割 + 枚举

代码:

// 字符串分割 + 枚举

class Solution
{
public:
    int maximumLength(string s)
    {
        // 特判
        if (s.empty())
            return 0;

        vector<int> groups[26];
        int n = s.length();
        int count = 0;
        for (int i = 0; i < n; i++)
        {
            count++;
            if (i + 1 == n || s[i] != s[i + 1])
            {
                groups[s[i] - 'a'].push_back(count); // 统计连续字符长度
                count = 0;
            }
        }

        int mx = 0;
        for (vector<int> &group : groups)
            for (int &x : group)
                mx = max(mx, x);
        // 枚举
        for (int ans = mx; ans >= mx - 2 && ans > 0; ans--)
        {
            // 枚举字母,计算该字母长度为 ans 的特殊子串有几个
            for (int i = 0; i < 26; i++)
            {
                int count = 0;
                for (int len : groups[i])
                    if (len >= ans)
                        count += len - ans + 1;
                if (count >= 3)
                    return ans;
            }
        }
        return -1;
    }
};

结果:

在这里插入图片描述

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

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

相关文章

2022-ECCV-Explaining Deepfake Detection by Analysing Image Matching

一、研究背景 1.大量工作将深度伪造检测作为一个二分类任务并取得了良好的性能。 2.理解模型如何在二分类标签的监督下学习伪造相关特征仍难是个艰巨的任务。 3.视觉概念&#xff1a;具有语义的人脸区域&#xff0c;如嘴、鼻子、眼睛。 二、研究目标 1.验证假设&#xff0c;并…

centos8部署MySQL5.7故障集

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 在centos8系统上安装MySQL&#xff0c;使用的是centos7上安装MySQL的脚本&#xff0c;出现了以下问题&#xff0c;以做记录&…

Spark原理——逻辑执行图

逻辑执行图 明确逻辑计划的边界 在 Action 调用之前&#xff0c;会生成一系列的RDD,这些RDD之间的关系&#xff0c;其实就是整个逻辑计划 val conf new SparkConf().setMaster("local[6]").setAppName("wordCount_source") val sc new SparkContext(conf)v…

多测师肖sir___ui自动化测试po框架讲解版

po框架 一、ui自动化po框架介绍 &#xff08;1&#xff09;PO是Page Object的缩写 &#xff08;2&#xff09;业务流程与页面元素操作分离的模式&#xff0c;可以简单理解为每个页面下面都有一个配置class&#xff0c; 配置class就用来维护页面元素或操作方法 &#xff08;3&am…

20240111在ubuntu20.04.6下解压缩RAR格式的压缩包

20240111在ubuntu20.04.6下解压缩RAR格式的压缩包 2024/1/11 18:25 百度搜搜&#xff1a;ubuntu rar文件怎么解压 rootrootrootroot-X99-Turbo:~/temp$ ll total 2916 drwx------ 3 rootroot rootroot 4096 1月 11 18:28 ./ drwxr-xr-x 25 rootroot rootroot 4096 1月…

【时事篇-02】20240110 365天存钱法(sum法)

背景需求 朋友圈里&#xff0c;一位保险推销员发布“存钱法广告”&#xff0c;我想用Python验算结果正确性 使用的是最近宫格数独里用到的”sum法” 代码展示 项目:存钱游戏计算 sum() 作者:阿夏 时间:2024年1月10日19:03 import random1、钻石版&#xff1a;从1元存到365元&a…

七星彩中奖号码模拟机器

七星彩号码抽取规则。 前区&#xff1a;抽取前区6个号码&#xff0c;每个号码是0~9之间选1个。 后区&#xff1a;抽取后区1个号码&#xff0c;每个号码是0~14之间选1个。 #七星彩模拟器&#xff0c;2024-01-12&#xff0c;by qs import random QianQu_6number [0,1,2,3,4,5,…

【C语言】linux内核set_task_stack_end_magic函数

一、函数定义 void set_task_stack_end_magic(struct task_struct *tsk) {unsigned long *stackend;stackend end_of_stack(tsk);*stackend STACK_END_MAGIC; /* for overflow detection */ } 内核版本6.4.3、6.7。 二、代码解读 解读1 这段代码是一个在Linux内核中定…

奇异值分解在图形压缩中的应用

奇异值分解在图形压缩中的应用 在研究奇异值分解的工程应用之前&#xff0c;我们得明白什么是奇异值&#xff1f;什么是奇异向量&#xff1f; 奇异值与奇异向量 概念&#xff1a;奇异值描述了矩阵在一组特定向量上的行为&#xff0c;奇异向量描述了其最大的作用方向。 奇异值…

Flash教程(一)入门

从本篇开始&#xff0c;我们将开始基于python的web开发系列教程&#xff0c;这里使用轻量级的web框架Flask。 1、简介 Flask是一个用来构建基于python语言的web应用程序的轻量级web框架。Flask的作者是来自Pocoo(由一群热爱python的人组建)的Armin Ronacher。本来只是作者的一…

Numpy使用简介

Numpy 相关题目 【Python】—— Numpy 初体验 【Python】—— NumPy基础及取值操作 Numpy是基于Python的通用数值计算工具包&#xff0c;其内包含大量数学计算函数和矩阵运算函数。多数科学计算工具包&#xff0c;比如Scipy&#xff0c;和数值分析工具包&#xff0c;比如Pandas…

大学物理-实验篇(二)——用分光计测定三棱镜的折射率(光:特定频段电磁波、光线在介质界面折射、平行光与凸透镜)

目录 预备知识 光&#xff1a;特定频段电磁波 光线在介质界面折射 平行光与凸透镜 实验目的 实验仪器 实验原理 实验步骤 准备分光计 目镜调焦 刻度盘读数 测三棱镜顶角 测三棱镜最小偏向角 数据处理 预备知识 光&#xff1a;特定频段电磁波 光速&#xff1a;…

YOLOv8涨点改进:多层次特征融合(SDI),小目标涨点明显,| UNet v2,比UNet显存占用更少、参数更少

💡💡💡本文独家改进:多层次特征融合(SDI),能够显著提升不同尺度和小目标的识别率 如何引入到YOLOv8 1)替代原始的Concat; 💡💡💡Yolov8魔术师,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,轻松带你…

H 指数,经典算法实战。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Mac上使用phpstudy+vscode配置PHP开发环境

使用的工具&#xff1a; 1、系统版本 2、vs code code 3、phpstudy_pro 一、下载vs code code以及必要的插件 1、vs code下载 点击vs code官网下载 选择对应的版本&#xff0c;一般电脑会自动识别对应的版本&#xff0c;点击下载&#xff0c;然后傻瓜式安装&#xff01; 2…

陶瓷碗口缺口检测-技术方案

项目背景 陶瓷碗出厂前需要做的质量检测工作包括对陶瓷碗是否有缺口的检测&#xff0c;利用图像处理技术也可以对陶瓷碗的缺口进行检测和定位。 技术方案 陶瓷碗口缺口检测包含如下五个步骤。首先通过CMOS相机获取陶瓷碗的图像&#xff0c;二值化处理后通过图像复原技术进行去…

1886_emacs_v29中的行号配置

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/editors_skills: Summary for some common editor skills I used. emacs 29中的行号显示配置 行号显示 行号显示是一个编辑器中很常见的功能&#xff0c;我觉得这个功能的需求度可能因人群或者个人习惯而不同。对于只…

果然程序员的世界不是 0 就是 1

在一场轰动全球的爱情故事中&#xff0c;OpenAI 的首席执行官、同时也是打破常规的浪漫英雄&#xff0c;奥特曼&#xff0c;与他的基友奥利弗穆尔赫林在夏威夷举行了一场迷人的婚礼。在奥特曼的岛屿别墅附近&#xff0c;这对低调却又令人羡慕的新人&#xff0c;在奥特曼的哥哥杰…

python 爬虫 生成markdown文档

本文介绍的案例为使用python爬取网页内容并生成markdown文档&#xff0c;首先需要确定你所需要爬取的框架结构&#xff0c;根据网页写出对应的爬取代码 1.分析总网页的结构 我选用的是redis.net.com/order/xxx.html (如:Redis Setnx 命令_只有在 key 不存在时设置 key 的值。…

win系统搭建Minecraft世界服务器,MC开服教程,小白开服教程

Windows系统搭建我的世界世界服务器&#xff0c;Minecraft开服教程&#xff0c;小白开服教程&#xff0c;MC 1.19.4版本服务器搭建教程。 此教程使用 Mohist 1.19.4 服务端&#xff0c;此服务端支持Forge模组和Bukkit/Spigot/Paper插件&#xff0c;如果需要开其他服务端也可参…