LC 6344. 字典序最小的美丽字符串

https://leetcode.cn/problems/lexicographically-smallest-beautiful-string/

最开始没有啥头绪,看了提示里面一点有点启发

If the string does not contain any palindromic substrings of lengths 2 and 3, then the string does not contain any palindromic substrings at all.

也就是说如果要确保没有任何回文的话,那么只需要保证长度2/3的串没有任何回文。

然后我们可以从最低位开始尝试+1/+2/+3(前提是不存在任何进位),否则不如直接增加高位。一旦在某个位置上可以增加成功的话,然后将剩余位置清零。

假设我们得到了 "abcdeaaaaa", 我们是在e这个位置上+1得到的,问题就是修正之后的aaaaa了,同样我们只需要确保不存在长度2/3的回文串就行。

class Solution:
    def smallestBeautifulString(self, s: str, k: int) -> str:
        CH = [ord(x) - ord('a') for x in s]
        n = len(CH)

        P = -1
        for i in reversed(range(n)):
            a, b, c = CH[i], CH[i - 1] if i - 1 >= 0 else -1, CH[i - 2] if i - 2 >= 0 else -1
            for j in range(1, k):
                a = CH[i] + j
                if a < k and a != b and a != c:
                    CH[i] = a
                    P = i
                    break
                if a >= k: break
            if P != -1: break

        if P == -1: return ""
        # print(CH, ''.join([chr(x + ord('a')) for x in CH]))

        for i in range(P + 1, n):
            a, b = CH[i - 2] if i - 2 >= 0 else -1, CH[i - 1] if i - 1 >= 0 else -1
            for j in range(k):
                if j != a and j != b:
                    CH[i] = j
                    break
        ans = ''.join([chr(x + ord('a')) for x in CH])
        return ans