链接:
题意
略
解:
要求字符串内不存在任何长度为 2
或更长的回文子字符串,则在任意位置不存在aa
或aba
形式
由于要被给定字符串字典序大,且找到符合条件的字典序最小字符串,则竟可能对靠后的字符做加法和进位
莽一波一直处理最后一个字符,寄的理所当然哈哈
因为默认给的是符合无回文的字符串,所以没被更改过的字符都不考虑,从最靠前的被修改过的字符开始判断它和前面是否构成回文,如果回文则字符加一,如不回文则处理靠后的字符。
代码很丑陋,看看注释得了
实际代码:
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
是一个美丽字符串