字典序最小的美丽字符串

如果一个字符串满足以下条件,则称其为 美丽字符串 :

  • 它由英语小写字母表的前 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;
    }
};

posted @ 2023-05-01 04:22  失控D大白兔  阅读(30)  评论(0编辑  收藏  举报