【问题标题】:JavaScript - Compare Strings and Remove First Character From One of the Strings Until They're EqualJavaScript - 比较字符串并从其中一个字符串中删除第一个字符,直到它们相等
【发布时间】:2019-05-07 20:34:15
【问题描述】:

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循环的语法错了,还是两者兼而有之?

【问题讨论】:

  • 算法上我会做一些更简单的事情。比较两个字符串的结尾并检查最长的相似字符串。在这种情况下将是“est”。两个字符串的剩余字符数的总和就是答案。
  • 应该是i &lt; Math.min(s.length, t.length)(s.length, t.length) 只返回 t.length,因为这就是 , 运算符在这样的表达式中所做的。
  • @4castle 好的,我继续将其更改为 i &lt; Math.min(s.length, t.length) - 该函数仍返回 4,所以我的代码肯定有其他问题......
  • @CarlosAlvesJorge 这很有道理——我会试试的。

标签: javascript for-loop string-comparison


【解决方案1】:

您的代码的一个问题是,在每次迭代结束时,您都在更新 sArraytArray 而没有更新 st

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

因此,您也应该更新st


另外,在这部分代码中:

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

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


另外,使用s = s.substring(1); 删除第一个字符应该比处理数组更简单...

以下是使用您自己的逻辑的 sn-p,但解决了我上面提到的问题。希望这会有所帮助!

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) 不断减少并接近零,因此循环将过早停止。我们想要的真正逻辑是继续循环,直到其中一个字符串变为空。

【讨论】:

  • 感谢您指出最后一个if-statement 中计数器的缺陷 - 是的,应该是 2。我不知道 substring() 方法 - 这让事情变得更简单。不幸的是,这仍然没有通过 CodeWars 中的所有测试。我注意到console.log(shiftLeft("test", "yes")); 在 CodeWars 说它应该返回 7 时返回 5。我不知道出了什么问题...
  • @HappyHands31 我发现了另一个缺陷。答案已更新。
  • 谢谢 - 说得通。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
相关资源
最近更新 更多