本文主要是介绍2024-06-22力扣每日一题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
链接:
2663. 字典序最小的美丽字符串
题意
略
解:
要求字符串内不存在任何长度为 2
或更长的回文子字符串,则在任意位置不存在aa
或aba
形式
由于要被给定字符串字典序大,且找到符合条件的字典序最小字符串,则竟可能对靠后的字符做加法和进位
莽一波一直处理最后一个字符,寄的理所当然哈哈
因为默认给的是符合无回文的字符串,所以没被更改过的字符都不考虑,从最靠前的被修改过的字符开始判断它和前面是否构成回文,如果回文则字符加一,如不回文则处理靠后的字符。
代码很丑陋,看看注释得了
实际代码:
#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
是一个美丽字符串
这篇关于2024-06-22力扣每日一题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!