携手创作,共同成长!这是我参与「掘金日新计划 · 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 <= 1000palindrome只包含小写英文字母。
解题思路:
如果回文串长度为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('');
};
最后
如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )