不理解这种在 2 个字符串之间查找子序列的迭代方法

这是问题:

编写一个名为的函数isSubsequence,它接受两个字符串并检查第一个字符串中的字符是否构成第二个字符串中字符的子序列。换句话说,函数应该检查第一个字符串中的字符是否出现在第二个字符串中的某个地方,而没有改变它们的顺序

我有下面的解决方案,但有几个部分我没有得到:

  1. 为什么需要:if (!str1) return true;

  2. 我也没有得到这一行:if (i===str1.length) return true;

将不胜感激任何解释谢谢!

function isSubsequence(str1, str2) {

  var i = 0;

  var j = 0;

  if (!str1) return true;

  while (j < str2.length) {

    if (str2[j] === str1[i]) i++;

    if (i === str1.length) return true;

    j++;

  }

  return false;

}


HUWWW
浏览 117回答 2
2回答

一只名叫tom的猫

为什么需要:if (!str1) return true;这是一个边界案例。它检查第一个字符串是否为空。有人会问:空字符串是否总是另一个字符串的子序列?答案是:是的。可以使该语句看起来与另一个if语句相同:if (i === str1.length) return true;。那也行。它表明实际上它正在执行相同的测试,但是对于i0 的情况。如果保证第二个字符串不为空,则实际上不需要此语句,因为在这种情况下,循环将进行第一次迭代,并且其他语句的条件将为真,因此该函数仍会返回真if。但是,如果两个字符串都是空的,该函数也应该返回 true,如果您没有此语句,则不会发生这种情况。我也没有得到这一行:if (i===str1.length) return true;istr1代表你在其中找到的字符数str2(按顺序)。所以如果i等于第一个字符串的长度,那么你就知道你已经找到了 : 的所有字符,str1所以继续循环是没有意义的,因为没有其他东西可以找到。因此,是时候以积极的结果退出该功能了。选择你可以让循环条件包括这个“退出”条件的否定,这样你就不再需要了if:function isSubsequence(str1, str2) {&nbsp; let i = 0;&nbsp; // Continue as long as there are characters to compare...&nbsp; for (let j = 0; i < str1.length && j < str2.length; j++) {&nbsp; &nbsp; if (str2[j] === str1[i]) i++;&nbsp; }&nbsp; // Now return true if, and only when, all of str1 was found in str2&nbsp; return i === str1.length;}

叮当猫咪

if (!str1) return true;当第一个字符串为空字符串时,此语句返回 true。因为我们可以通过删除另一个字符串的所有字符来导出一个空字符串。这就是为什么空字符串是任何字符串的子序列。除非明确提到我们正在寻找一个非空子序列。if (i===str1.length) return true;当我们检查两个字符串的字符是否相等时,如果我们到达第一个字符串的末尾并且所有前面的字符都相等,我们可以说 str1 是 str2 的子序列。此时我们需要从函数中返回,否则,你将无法在str1中找到另一个字符。你可以看到下面的例子。str1 = 'abc'。str2 = 'abcdefg'。我=0,j=0:str1[i] = 'a'str2[j] = 'a'我=1,j=1:str1[i] = 'b'str2[j] = 'b'我=2,j=2:str1[i] = 'c'str2[j] = 'c'此时我们在 str1 的末尾。现在,如果我们不返回,那么会发生什么?我=3,j=3str1[3] = '垃圾值'str2[3] = 'd'它们不匹配,所以我们不断增加 j 的值,但我们不会更新 i 的值。因为if (str2[j] === str1[i]) i++;。在那种情况下,我们将遍历 str2 长度,最后我们将返回 false。这是一个错误的结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript