You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:40:07