LeetCode1328 破坏回文串

LeetCode 1328 破坏回文串

题目

给你一个由小写英文字母组成的回文字符串 palindrome ,请你将其中 一个 字符用任意小写英文字母替换,使得结果字符串的 字典序最小 ,且 不是 回文串。

请你返回结果字符串。如果无法做到,则返回一个 空串 。

如果两个字符串长度相同,那么字符串 a 字典序比字符串 b 小可以这样定义:在 a 和 b 出现不同的第一个位置上,字符串 a 中的字符严格小于 b 中的对应字符。例如,"abcc” 字典序比 "abcd" 小,因为不同的第一个位置是在第四个字符,显然 'c' 比 'd' 小。

思路

对于一个回文串,将其变成非回文串只需要改变一个字母即可。字符串中字母a出现的位置越靠前,则这个字符串的字典序越小。因此:

  1. 如果在回文串的前半段存在非a字符,则将第一个非a字符变为a即可。
  2. 如果回文串长度为奇数,则最中间的字母不可改变(无论怎么变化都是回文串)
  3. 如果第一步中未进行任何操作,则需要在字符串后半段改变一个字符,同第一步一样,如果后半段存在非a字符,则将第一个非a字符变为a即可。
  4. 如果上一步也未进行操作,意味着字符串时"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;
    }
};
posted @ 2021-11-12 13:35  流光之中  阅读(49)  评论(0编辑  收藏  举报