LeetCode1328 破坏回文串
LeetCode 1328 破坏回文串
题目
给你一个由小写英文字母组成的回文字符串 palindrome ,请你将其中 一个 字符用任意小写英文字母替换,使得结果字符串的 字典序最小 ,且 不是 回文串。
请你返回结果字符串。如果无法做到,则返回一个 空串 。
如果两个字符串长度相同,那么字符串 a 字典序比字符串 b 小可以这样定义:在 a 和 b 出现不同的第一个位置上,字符串 a 中的字符严格小于 b 中的对应字符。例如,"abcc” 字典序比 "abcd" 小,因为不同的第一个位置是在第四个字符,显然 'c' 比 'd' 小。
思路
对于一个回文串,将其变成非回文串只需要改变一个字母即可。字符串中字母a出现的位置越靠前,则这个字符串的字典序越小。因此:
- 如果在回文串的前半段存在非a字符,则将第一个非a字符变为a即可。
- 如果回文串长度为奇数,则最中间的字母不可改变(无论怎么变化都是回文串)
- 如果第一步中未进行任何操作,则需要在字符串后半段改变一个字符,同第一步一样,如果后半段存在非a字符,则将第一个非a字符变为a即可。
- 如果上一步也未进行操作,意味着字符串时"aaabaaa",这种类型的,只需要将最后一位字符加1即可。
Code
class Solution {
public:
string breakPalindrome(string palindrome) {
if(palindrome.size()==1){
return string("");
}
bool up=false;
for(int i=0;i<=palindrome.size()/2-1;i++){
if(palindrome[i]!='a'){
palindrome[i]='a';
up=true;
break;
}
}
if(!up){
int i;
if(palindrome.size()%2==0){
i=palindrome.size()/2;
}
else{
i=palindrome.size()/2+1;
}
for(;i<palindrome.size();i++){
if(palindrome[i]!='a'){
palindrome[i]='a';
up=true;
break;
}
}
}
if(!up){
palindrome[palindrome.size()-1]++;
}
return palindrome;
}
};