字典序最小的美丽字符串
如果一个字符串满足以下条件,则称其为 美丽字符串 :
- 它由英语小写字母表的前 k 个字母组成。
- 它不包含任何长度为 2 或更长的回文子字符串。
返回下一个美丽字符串
1. 贪心更改
从后往前试探增加,满足条件继续往后走,同时判断是否满足回文
class Solution {
public:
string smallestBeautifulString(string s, int k) {
//先贪心修改一次
//有进位则左移进位
//不满足回文则继续贪心修改
//满足回文则继续右移判断
//每次贪心更改后,只用判断相邻的两位即可
//判断他们组成的长度为2,或长度为3的子字符串是否回文,长度大于3必不可能回文(原字符串是美丽字符串)
k += 'a'; //k表示上限
int n = s.length(), i = n - 1;
++s[i]; // 尝试从最后一个字母开始增加,使得字典序最小且满足条件
while (i < n) {
if (s[i] == k) { // 超过范围
if (i == 0) return ""; // 无法进位
// 进位
s[i] = 'a'; //置为最小
++s[--i]; //移动指针且进位
} else if (i && s[i] == s[i - 1] || i > 1 && s[i] == s[i - 2]) {//如果修改当前位会构成回文字符串
++s[i]; // 如果 s[i] 和前面的字符形成回文串,就继续增加 s[i]
}
else ++i; // 检查 s[i] 是否和后面的字符形成回文串
}
return s;
}
};