题目地址:
https://leetcode.com/problems/break-a-palindrome/
给定一个只含英文小写字母的非空回文串 s s s,允许将其中一个字母改为另一个英文小写字母,问能得到的字典序最小且非回文的字符串是什么。如果做不到则返回空串。
首先,由于
s
s
s本身就是回文串,我们修改串前半部分的任意字母都会得到非回文串,而我们又需要字典序最小,所以先遍历
s
[
0
:
l
s
/
2
−
1
]
s[0:l_s/2-1]
s[0:ls/2−1],如果第一次遇到了非'a'的字符,直接将其改为'a'返回即可。如果前半部分都是'a',则说明后半部分也都是'a',那么可以得到的最小字典序就是将最后一个字母改为'b'。但这里要排除掉
l
s
=
1
l_s=1
ls=1的情况。代码如下:
class Solution {
public:
string breakPalindrome(string s) {
if (s.size() == 1) return "";
for (int i = 0, j = s.size() - 1; i < j; i++, j--) {
if (s[i] != 'a') {
s[i] = 'a';
return s;
}
}
s.back() = 'b';
return s;
}
};
时间复杂度 O ( l s ) O(l_s) O(ls),空间 O ( 1 ) O(1) O(1)。
博客围绕LeetCode上的题目展开,给定非空回文串s,允许改一个字母,求字典序最小且非回文的字符串。分析得出修改串前半部分字母可得非回文串,给出遍历求解思路,还排除ls=1的情况,时间复杂度O(ls),空间O(1)。

303

被折叠的 条评论
为什么被折叠?



