JavaScript-比较字符串并从其中一个字符串中删除第一个字符,直到它们相等为止

时间:2019-05-07 20:34:15

标签: javascript for-loop string-comparison

Link to CodeWars kata

  

为您提供两个字符串。一键移动,您可以选择其中任意一个,然后删除第一个(即最左边的)字符。

     

例如:

     

通过将移动应用于字符串“ where”,结果是字符串“ here”。   通过对字符串“ a”进行移动,结果为空字符串“”。   实现一个函数,该函数计算使给定字符串相等时应执行的最小移动次数。

     

注意:

     

两个字符串均由小写拉丁字母组成。   如果该字符串已经为空,则无法再执行删除操作。

我的问题是,我假设您需要遍历两个字符串以继续比较它们是否相等。如果它们不相等,请增加计数器并再次循环。

但是我不确定我是否一次正确地遍历两个字符串。

i < (s.length, t.length);的语法正确吗?

这是我尝试过的:

function shiftLeft(s, t) {

    let sArray = s.split("");
    let tArray = t.split("");

    let counter = 0;

    for (let i = 0; i < Math.min(s.length, t.length); i++) {

        if (s === t) {
            return counter;
        }

        if (s !== t && s.length > t.length) {
            sArray.shift("");
            counter += 1;
        }

        if (s !== t && t.length > s.length) {
            tArray.shift("");
            counter += 1;
        }

        if (s !== t && t.length === s.length) {
            sArray.shift("");
            tArray.shift(""); 
            counter += 1;
        }
    }

    return counter;

}

console.log(shiftLeft("west", "test"));

但是它给了我有关测试的错误值-"test""west"的计数器只能等于2,并且返回4。

我的逻辑错了吗?或者是for循环的语法?还是两者都有?

1 个答案:

答案 0 :(得分:3)

代码存在的问题是,在每次迭代结束时,您将更新sArraytArray,而不更新st

然后,在下一次迭代中,您将检查s和t是否相等,除非从一开始它们就相等,否则将永远不是这种情况。

因此,您还应该同时更新st


此外,在代码的这一部分:

if (s !== t && t.length === s.length) {
            sArray.shift("");
            tArray.shift(""); 
            counter += 1;
}

计数器不应该加2吗? (我认为这是两个步骤,但这取决于您)。


另外,使用s = s.substring(1);删除第一个字符比处理数组要难得多...

以下是使用您自己的逻辑的代码段,但解决了我上面提到的内容。希望这会有所帮助!

function shiftLeft(s, t) {

    let counter = 0;

    while(Math.min(s.length, t.length) > 0) {

        if (s === t) {
            return counter;
        }

        if (s !== t && s.length > t.length) {
            s = s.substring(1);
            counter += 1;
        }

        if (s !== t && t.length > s.length) {
            t = t.substring(1);
            counter += 1;
        }

        if (s !== t && t.length === s.length) {
            s = s.substring(1);
            t = t.substring(1);
            counter += 2; //shouldn't this be 2 instead of 1?
        }
    }

    return counter;

}

console.log(shiftLeft("test", "yes"));

编辑:事实证明您的for循环条件不正确。计数器i继续增加,而Math.min(s.length, t.length)不断减少并接近于零,因此循环将过早停止。我们想要的真正逻辑是不断循环直到其中一个字符串为空。