题目描述:
给你一个由小写英文字母组成的回文字符串 palindrome
,请你将其中 一个 字符用任意小写英文字母替换,使得结果字符串的 字典序最小 ,且 不是 回文串。
请你返回结果字符串。如果无法做到,则返回一个 空串 。
如果两个字符串长度相同,那么字符串 a
字典序比字符串 b
小可以这样定义:在 a
和 b
出现不同的第一个位置上,字符串 a
中的字符严格小于 b
中的对应字符。例如,"abcc”
字典序比 "abcd"
小,因为不同的第一个位置是在第四个字符,显然 'c'
比 'd'
小。
代码思路:
- 特殊情况处理:如果字符串长度为1,无法替换字符使其不是回文串,因此返回空串。
- 替换前半部分字符:由于字符串是回文的,我们只需要考虑前半部分(包括中间字符,如果长度为奇数)的字符替换。替换后半部分的字符会得到与替换前半部分对称位置的字符相同的结果,仍然会是回文串。
- 替换为最小字符:为了使得结果字符串的字典序最小,我们应该尽量将前半部分的字符替换为
'a'
。但是,如果前半部分所有字符已经是'a'
,那么替换为'a'
不会改变字典序,同时字符串仍然会是回文串。这时,我们可以考虑将最后一个字符(或者倒数第二个字符,如果长度为偶数)替换为'b'
(或者任何不是'a'
的字符,但'b'
是一个合理的选择以保持字典序尽可能小)。
关键点
- 遍历前半部分:由于回文对称性,只需考虑前半部分。
- 优先替换为'a':为了保持字典序最小。
- 处理全为'a'的情况:如果前半部分都是
'a'
,则替换最后一个字符为'b'
(或其他非'a'
字符)。
代码实现:
class Solution:def breakPalindrome(self, palindrome: str) -> str:n = len(palindrome)if n == 1:return ""for i in range(n//2):if palindrome[i] != "a":return palindrome[:i]+"a"+palindrome[i+1:]else:return palindrome[:-1]+"b"