题目:2663. 字典序最小的美丽字符串
思路:假设回文串的长度是n,那么n-2(去掉两边,且大小不为1)自然也是回文串。最后,避免回文串,需要达到的条件是:s[i]!=s[i-1]、s[i]!=s[i-2]。需要字典序最小,那么就从字符串的最右边开始处理。细节看注释
class Solution {
public:
string smallestBeautifulString(string s, int k) {
int n=s.size();
//从字符串的最右边开始处理
int i=n-1;
//边界,超过边界,就需要进位(这里相当于k进制)
char border=k+'a';
//先对当前的字符串进行+1处理
s[i]++;
//跳出的条件是i==n,也就是前面都符合条件了
while(i<n){
//超过边界,就需要进位
if(s[i]==border){
//不是第一个位置
if(i){
//进位
s[i]='a';
s[i-1]++;
//因为i-1发生了变化,所以就需要到i-1位置来判断是否符合要求(也就是i-1的前两个位置是否会形成回文串)
i--;
}else{
//是第一个位置,说明不存在
return "";
}
}else if(i&&(s[i]==s[i-1])|| i>1&&(s[i]==s[i-2])){
//这里判断是否为回文串:只需要判断前面两个数
s[i]++;
}else{
//当前位置和前两个位置都不会形成回文串,所以接着判断下一个位置
i++;
}
}
return s;
}
};