LeetCode Everyday - 破坏回文串

87 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情 >>

破坏回文串

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

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

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

示例1:

输入:palindrome = "abccba"
输出:"aaccba"
解释:存在多种方法可以使 "abccba" 不是回文,例如 "zbccba", "aaccba", 和 "abacba" 。
在所有方法中,"aaccba" 的字典序最小。

示例2:

输入: palindrome = "a"
输出: ""
解释: 不存在替换一个字符使 "a" 变成非回文的方法,所以返回空字符串。

提示:

  • 1 <= palindrome.length <= 1000
  • palindrome 只包含小写英文字母。

解题思路:

如果回文串长度为1,无法转化,直接返回空字符串;
因为字典序中a是最小字符,贪心思想,在回文串前半部分对最靠前的非a字符,替换为a,可以保证字典序最小;
如果前半部分全部是a,因为中间的元素替换后还是回文,只能替换最后一个字符,把它替换为b。

我的答案:

/**
 * @param {string} palindrome
 * @return {string}
 */
var breakPalindrome = function(palindrome) {
    if (palindrome.length === 1) return '';
    let a = palindrome.split('');
    let l = 0, r = a.length-1;
    while (l < r && a[l] === 'a') {
        l++; r--;
    }
    if (l < r) {
        a[l] = 'a';
        return a.join('');
    }
    a[a.length-1] = 'b';
    return a.join('');
};

最后

如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )