即使我确实达到了比预期更好的解决方案,为什么这段代码在 leetcode 问题的测试用例中仍然失败?

问题描述 投票:0回答:1

问题是找到使字符串 S 成为回文的最小移动次数。假设 S 总是可以成为回文,并且移动是 S 的 2 个字符之间的简单交换

这是leetcode问题

我用这个打字稿代码解决了问题:

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 预期的要少。

我得到了以下结果:

algorithm recursion computer-science
1个回答
0
投票

这可能是一个错误。同时我在 github 存储库中打开了一个问题:在此处输入链接描述

© www.soinside.com 2019 - 2024. All rights reserved.