【Leetcode】2663. 字典序最小的美丽字符串

题目

题目链接🔗
如果一个字符串满足以下条件,则称其为 美丽字符串

  • 它由英语小写字母表的前 k 个字母组成。
  • 它不包含任何长度为 2 或更长的回文子字符串。

给你一个长度为 n 的美丽字符串 s 和一个正整数 k 。
请你找出并返回一个长度为 n 的美丽字符串,该字符串还满足:在字典序大于 s 的所有美丽字符串中字典序最小。如果不存在这样的字符串,则返回一个空字符串。
对于长度相同的两个字符串 a 和 b ,如果字符串 a 在与字符串 b 不同的第一个位置上的字符字典序更大,则字符串 a 的字典序大于字符串 b 。

  • 例如,“abcd” 的字典序比 “abcc” 更大,因为在不同的第一个位置(第四个字符)上 d 的字典序大于 c 。

示例 1:

输入:s = “abcz”, k = 26
输出:“abda”
解释:字符串 “abda” 既是美丽字符串,又满足字典序大于 “abcz” 。
可以证明不存在字符串同时满足字典序大于 “abcz”、美丽字符串、字典序小于 “abda” 这三个条件。

示例 2:

输入:s = “dc”, k = 4
输出:“”
解释:可以证明,不存在既是美丽字符串,又字典序大于 “dc” 的字符串。

提示:

  • 1 ≤ n = s . l e n g t h ≤ 1 0 5 1 \leq n = s.length \leq 10^5 1n=s.length105
  • 4 < = k < = 26 4 <= k <= 26 4<=k<=26
  • s 是一个美丽字符串 s 是一个美丽字符串 s是一个美丽字符串

思路

首先,我们分析一下美丽字符串的条件:美丽字符串由前 k 个小写字母组成,并且不包含任何长度为 2 或更长的回文子字符串。为了满足这个条件,只需要确保每个字符都不与其前两个字符相同。
接下来,我们需要找到一个字典序大于给定字符串 s 的美丽字符串,并且在所有可能的字符串中字典序最小。为了实现这一点,可以采用贪心算法,从字符串末尾开始逐个字符递增,直到找到满足条件的字符位置。

具体步骤

  1. 寻找可以增大的字符位置:
    • 从字符串末尾开始,逐个字符向前尝试将字符增大。
    • 对于每个字符位置,尝试将其递增一个字符,同时确保新字符不与其前两个字符相同。
  2. 字符递增并检测美丽字符串条件:
    • 找到一个可以增大的字符位置后,将其递增,同时保证新字符不引入长度为 2 或 3 的回文子字符串。
    • 更新该字符后,需要将其后面的字符重置为最小可能值,以确保生成的字符串在字典序上最小。
  3. 处理未找到可增大字符位置的情况:
    • 如果从头到尾都没有找到可以增大的字符位置,则返回空字符串,表示不存在符合条件的字符串。

代码

class Solution {
public:
    string smallestBeautifulString(string s, int k) {
        int n = s.size();
        int index = n - 1;

        // 步骤 1:寻找可以增大的字符位置
        while (index >= 0) {
            int t = s[index] + 1;
            // 跳过会导致回文子串的字符
            while (t < 'a' + k && (index > 0 && t == s[index - 1] || index > 1 && t == s[index - 2])) {
                ++t;
            }
            if (t < 'a' + k) {
                s[index] = t;
                break;
            }
            --index;
        }

        // 如果没有找到可增大的字符位置,返回空字符串
        if (index < 0) return "";

        // 步骤 2:调整剩余的字符为最小的合法字符
        for (int i = index + 1; i < n; ++i) {
            s[i] = 'a';
            // 跳过会导致回文子串的字符
            while (s[i] == s[i - 1] || (i > 1 && s[i] == s[i - 2])) {
                ++s[i];
            }
        }

        return s;
    }
};

复杂度分析

时间复杂度

  • 时间复杂度:O(n),因为我们最多需要遍历字符串两次。

空间复杂度

  • 空间复杂度:O(1),只使用了常数级别的额外空间。

结果

在这里插入图片描述

总结

通过上述方法,我们能有效地找到满足条件的下一个美丽字符串。这种方法不仅保证了生成字符串的字典序大于给定字符串,还确保了字典序最小。该解决方案结合了贪心算法和条件检查,使其在处理大规模输入时依然高效可靠。

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

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

相关文章

Android低版本上APP首次启动时间减少80%(二)

06-25 15:10:53.821 7449 7450 D dalvikvm: threadid2: sending two SIGSTKFLTs to threadid135 (tid8021) to cause debuggerd dump SIGSTKFLT 是 Dalvik 虚拟机特有的一个信号。当虚拟机发生了 ANR 或者需要做 GC 的时候&#xff0c;就需要挂起所有 RUNNING 状态的线程&…

技巧:合并多个RAR分卷压缩

因为文件压缩之后体积仍然过大&#xff0c;大家可能会选择进行分卷压缩&#xff0c;那么rar分卷压缩包之后如何合并成一个压缩包文件呢&#xff1f;今天我们来学习rar分卷压缩包&#xff0c;合并成一个的方法。 最基础的方法就是将分卷压缩包解压出来之后&#xff0c;再将文件…

第10章 启动过程组 (概述)

第10章 启动过程组 概述&#xff0c;在第三版教材第354~355页&#xff1b; 文字图片音频方式 视频11 第一个知识点&#xff1a;两个过程 如图10-1 启动过程组第二个知识点&#xff1a;目的 协调各方干系人的期望与项目目的&#xff0c;告知各干系人项目范围和目标&#xff0c…

如何用 Google Chrome 浏览器浏览经过 XSLT 渲染的 XML 文件

对于经过XSLT渲染的XML文件&#xff0c;本来&#xff0c;可以直接用 IE (Internet Explorer) 打开&#xff0c;就能看到渲染之后的样子&#xff0c;很方便。但是后来&#xff0c;微软把 IE 换成了 Microsoft Edge&#xff0c;按理说这是比 IE 更先进的浏览器&#xff0c;可是偏…

软件缺陷及JIRA工具

一、软件缺陷及跟踪流程 1&#xff0c;软件缺陷信息 案例 &#xff08;1&#xff09;缺陷报告的基本内容 缺陷的标题 预置条件 重现步骤 期望结果 实际结果 &#xff08;2&#xff09;软件缺陷的状态 新建 打开 修复 关闭 &#xff08;3&#xff09;软件缺陷的严重程度 …

【计算机毕业设计】204基于微信小程序疫情期间学生请假与销假系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【论文阅读】-- Attribute-Aware RBFs:使用 RT Core 范围查询交互式可视化时间序列颗粒体积

Attribute-Aware RBFs: Interactive Visualization of Time Series Particle Volumes Using RT Core Range Queries 摘要1 引言2 相关工作2.1 粒子体渲染2.2 RT核心方法 3 渲染彩色时间序列粒子体积3.1 场重构3.1.1 密度场 Φ3.1.2 属性字段 θ3.1.3 优化场重建 3.2 树结构构建…

灵感枯竭?来看Charls,新指标发一区(IF=9.3)| CHARLS等七大老年公共数据库周报(6.12)...

七大老年公共数据库 七大老年公共数据库共涵盖33个国家的数据&#xff0c;包括&#xff1a;美国健康与退休研究 (Health and Retirement Study, HRS)&#xff1b;英国老龄化纵向研究 &#xff08;English Longitudinal Study of Ageing, ELSA&#xff09;&#xff1b;欧洲健康、…

快速识别银行卡,API接口让金融更智能

随着科技的不断进步&#xff0c;金融行业也变得越来越智能化。一项名为银行卡识别的技术&#xff0c;正在逐渐改变着我们的金融生活。使用API接口&#xff0c;我们能够快速准确地识别银行卡的卡号、有效期、发卡行和卡片类型等关键字段&#xff0c;不仅方便了用户&#xff0c;也…

visual studio 创建c++项目

目录 环境准备&#xff1a;安装 visual studiovisual studio 创建c项目Tips&#xff1a;新建cpp文件注释与取消注释代码 其他初学者使用Visual Studio开发C和C时常遇到的3个坑 环境准备&#xff1a;安装 visual studio 官网&#xff1a;https://visualstudio.microsoft.com/zh…

威纶通触摸屏软件出现显示异常问题(显示黑色)处理方法

异常现象 电脑端显示异常&#xff0c;显示黑色 解决方法 Step1&#xff1a;软件根目录查找DisplaySetting.exe Step2&#xff1a;勾选第1或第2项&#xff0c;重启软件即可 分享创作不易&#xff0c;请多多支持&#xff0c;点赞、收藏、关注&#xff01; Ending~

基于java+springboot+vue实现的电商应用系统(文末源码+Lw)241

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本电商应用系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…

iTextSharp 绘制pdf

一、新建项目&#xff1a;pdfdemo <ItemGroup><PackageReference Include"iTextSharp.LGPLv2.Core" Version"3.4.20" /> </ItemGroup>二、HomeController.cs using iTextSharp.text; using iTextSharp.text.pdf; using Microsoft.AspN…

性能工具之 MySQL OLTP Sysbench BenchMark 测试示例

文章目录 一、前言二、测试环境1、服务器配置2、测试拓扑 三、测试工具安装四、测试步骤1、导入数据2、压测数据3、清理数据 五、结果解析六、最后 一、前言 做为一名性能工程师掌握对 MySQL 的性能测试是非常必要的&#xff0c;本文基于 Sysbench 对MySQL OLTP&#xff08;联…

Python应用开发——30天学习Streamlit Python包进行APP的构建(7)

st.data_editor 显示数据编辑器 widget。 数据编辑器 widget 可让你在类似表格的用户界面中编辑数据框和许多其他数据结构。 警告 When going from st.experimental_data_editor to st.data_editor in 1.23.0, the data editors representation in st.session_state was ch…

展厅装修时候需要注意哪些细节

1、视觉方面 展厅应该具有很强的视觉冲击力。只有这样不论是领导视察还是合作的客户进行参观的时候才会对展厅产生浓厚的兴趣&#xff0c;同时产生一种亲和力&#xff0c;并直接加深对企业的识别度和记忆度。而个性化设计要跟企业文化相符合。这里&#xff0c;企业标志为寻求个…

Stable Diffusion vs DALL·E3

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

六、(正点原子)pinctrl子系统和gpio子系统

前面我们使用设备树来驱动LED灯&#xff0c;其实就是将LED寄存器地址写入到设备树的属性reg中&#xff0c;通过OF函数 &#xff0c;读取到LED灯的寄存器信息&#xff0c;从而操作寄存器来控制LED灯。在操作LED灯时候&#xff0c;我们使用到GPIO这个引脚&#xff0c;通过对这个G…

RabbitMQ实践——最大长度队列

大纲 抛弃消息创建最大长度队列绑定实验 转存死信创建死信队列创建可重写Routing key的最大长度队列创建绑定关系实验 在一些业务场景中&#xff0c;我们只需要保存最近的若干条消息&#xff0c;这个时候我们就可以使用“最大长度队列”来满足这个需求。该队列在收到消息后&…

leetCode40组合总和(回溯)

题目 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次示例 : 输入: candidates [2,5,2,1,2], target 5, 输出: [ [1,2,2], [5] ]回溯一般模…