2024-06-22力扣每日一题

链接:

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

题意

要求字符串内不存在任何长度为 2 或更长的回文子字符串,则在任意位置不存在aaaba形式

由于要被给定字符串字典序大,且找到符合条件的字典序最小字符串,则竟可能对靠后的字符做加法和进位

莽一波一直处理最后一个字符,寄的理所当然哈哈

因为默认给的是符合无回文的字符串,所以没被更改过的字符都不考虑,从最靠前的被修改过的字符开始判断它和前面是否构成回文,如果回文则字符加一,如不回文则处理靠后的字符。

代码很丑陋,看看注释得了

实际代码:

c++ 复制代码
#include<bits/stdc++.h>
using namespace std;
string smallestBeautifulString(string s, int k)
{
    int lg=s.length(),mao=lg-1,zt=1;

    while(true)
    {
        if(zt)//第一次无条件执行 
        {
            s[mao]++;
        }
        
        if(mao>1)
        {
            if(s[mao]==s[mao-1] || s[mao]==s[mao-2])
            {
                while(s[mao]==s[mao-1] || s[mao]==s[mao-2]) s[mao]++;//有回文则++
            }
            else if(!zt) mao++;//无回文则处理后面的字符
        }
        else if(mao>0)
        {
            if(s[mao]==s[mao-1])
            {
                while(s[mao]==s[mao-1]) s[mao]++;
            }
            else if(!zt) mao++;
        }
        else if(!zt) mao++;
        if(zt) zt=0;
        
        //cout<<"mao:"<<mao<<endl; 
        if(mao>=lg) break;
        
        //cout<<"s[mao]:"<<s[mao]<<endl; 
        while(s[mao]-'a'+1>k)//进位则需要处理新的字符
        {
            s[mao]-=k;
            mao--;
            if(mao<0) return "";//首字符还进位则无符合条件字符串
            else s[mao]++;
        }
    }
    
    return s;
}
int main()
{
    string s;
    int k;
    
    cin>>s>>k;
    
    string ans=smallestBeautifulString(s,k);
    cout<<ans<<endl;
    return 0;
}

限制:

  • 1 <= n == s.length <= 105
  • 4 <= k <= 26
  • s 是一个美丽字符串
相关推荐
c2385640 分钟前
《枚举算法 “翻译官”:用 enum class 给 “游游的礼盒” 算分》
c语言·c++·算法
noipp1 小时前
推荐题目:洛谷 P5843 [SCOI2012] Blinker 的噩梦
c语言·数据结构·c++·算法·游戏·洛谷·luogu
极客BIM工作室1 小时前
OpenCascade 倒角(Chamfer)算法完整逻辑解析
算法
冻柠檬飞冰走茶1 小时前
PTA基础编程题目集 7-20 打印九九口诀表(C语言实现)
c语言·开发语言·数据结构·算法
鱼子星_1 小时前
《算 · 法》题目解析篇(1):最近公共祖先问题,线段树,最长回文子序列
c++·算法·动态规划·递归
雾喔1 小时前
算法练习5
算法·代理模式
问商十三载1 小时前
RAG 检索召回越多越好?2026 信噪比模型深度解析
人工智能·算法·机器学习
额恩661 小时前
ResearchPilot 第三阶段总结报告
python·算法
Hi李耶2 小时前
【LeetCode】9-回文数
算法·leetcode·职场和发展
红叶舞2 小时前
基于线段树的数据结构
数据结构·python·算法