LeetCode 2193题代码提交失败,为何更优解法未被认可?
解决LeetCode 2193. 构造回文串的最少移动次数问题
给定仅由小写英文字母组成的字符串
s,每次操作可选择s中任意两个相邻字符进行交换。返回将s转换为回文串所需的最小操作次数。输入保证s可转换为回文。
我用TypeScript实现的代码如下:
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]) { // 将该字符交换到末尾的代价 rightSwapsCost = Math.min(rightSwapsCost, s.length - 1 - i) } else if (s[i] === s[s.length - 1]) { // 将该字符交换到首部的代价 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 - 选择代价更小的操作执行,之后递归处理去掉首尾字符后的新字符串
代码通过了s="aabb"和s="letelt"的测试,但提交时在测试用例s="eqvvhtcsaaqtqesvvqch"上失败,奇怪的是我的解法算出的步数比LeetCode的预期值还要少。
内容的提问来源于stack exchange,提问作者EEAH
相关产品推荐
相关产品推荐

