问题是找到使字符串 S 成为回文的最小移动次数。假设 S 总是可以成为回文,并且移动是 S 的 2 个字符之间的简单交换
我用这个打字稿代码解决了问题:
function minMovesToMakePalindrome(s: string) {
if (s.length <= 1) return 0;
if (s[0] === s[s.length - 1]) return minMovesToMakePalindrome(s.slice(1, s.length - 1))
let leftSwapsCost = s.length;
let rightSwapsCost = s.length;
for (let i = 0; i < s.length; i++) {
if (s[i] === s[0]) {
// we should swap with the last element
rightSwapsCost = Math.min(rightSwapsCost, s.length - 1 - i)
} else if (s[i] === s[s.length - 1]) {
// we should swap with the first element
leftSwapsCost = Math.min(leftSwapsCost, i)
}
}
if (leftSwapsCost <= rightSwapsCost) {
const newString = [s[leftSwapsCost], ...s.slice(1, leftSwapsCost), s[0], ...s.slice(leftSwapsCost + 1)].join('');
console.log('left: ' + newString + ' cost: ' + leftSwapsCost)
return leftSwapsCost + minMovesToMakePalindrome(newString.slice(1, s.length - 1))
} else {
const newString = [...s.slice(0, s.length - 1 - rightSwapsCost), s[s.length - 1], ...s.slice(s.length - rightSwapsCost, s.length - 1), s[s.length - 1 - rightSwapsCost]].join('');
console.log('right: ' + newString + ' cost: ' + rightSwapsCost)
return rightSwapsCost + minMovesToMakePalindrome(newString.slice(1, s.length - 1))
}
};
基本上,我正在遍历字符数组(字符串),查找等于第一项的项目索引,然后计算将其中每一项与最后一项交换的成本,并将其最小值存储在
rightSwapsCost
中
。 leftSwapsCost
中。
最后,我进行成本更低的交换,并在新字符串(交换后获得)上递归调用该函数
newString
,该函数不包含交换之前原始字符串的第一个和最后一个元素。
它通过了初始测试用例,其中 S =“aabb”和 S =“letelt”
但是当我提交时它没有接受S =“eqvvhtcsaaqtqesvvqch”情况下的答案。这很奇怪,因为它确实使字符串回文的移动次数比 leetcode 预期的要少。
我得到了以下结果:
这可能是一个错误。同时我在 github 存储库中打开了一个问题:在此处输入链接描述