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

问题描述

这是问题:

编写一个名为i函数,该函数接受两个字符串,并检查第一个字符串中的字符是否形成第二个字符串中的字符的子序列。换句话说,该函数应检查第一个字符串中的字符是否出现在第二个字符串的某处,顺序不变

我有下面的解决方案,但是有一些我不了解的地方:

  1. 为什么需要:isSubsequence
  2. 我也没收到此行:if (!str1) return true;

感谢任何解释,谢谢!

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

解决方法

  1. if (!str1) return true;

当第一个字符串为空字符串时,此语句返回true。因为我们可以通过删除另一个字符串的所有字符来派生一个空字符串。这就是为什么空字符串是任何字符串的子序列的原因。除非明确提及,否则我们正在寻找非空子序列。 Ref

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

虽然我们要检查两个字符串的字符是否相等,但是如果我们击中第一个字符串的末尾并且所有先前的字符都相等,则可以说str1是str2的子序列。此时我们需要从函数返回,否则,您将无法在str1中找到另一个字符。您可以看到以下示例。

str1 ='abc'。

str2 ='abcdefg'。

i = 0,j = 0:

str1 [i] ='a'

str2 [j] ='a'

i = 1,j = 1:

str1 [i] ='b'

str2 [j] ='b'

i = 2,j = 2:

str1 [i] ='c'

str2 [j] ='c'

这时我们到了str1的结尾。现在,如果我们不回来,那会发生什么?

i = 3,j = 3

str1 [3] ='垃圾值'

str2 [3] ='d'

它们不匹配,因此我们不断增加j的值,但不会更新i的值。由于if (str2[j] === str1[i]) i++;。在这种情况下,我们将遍历str2长度,最后返回false。这是错误的结果。

,

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

这是一个边界情况。它检查第一个字符串是否为空。有人会问:一个空字符串是否总是另一个字符串的子序列?答案是:是的。

可以使该语句看起来与其他if语句:if (i === str1.length) return true;相同。那也可以。并且表明实际上它正在执行相同的测试,但是对于i为0的情况。

如果保证第二个字符串不为空,则实际上不需要此语句,因为在这种情况下,循环将进行第一次迭代,因此其他if语句的条件为true,因此该函数仍将返回true。但是,如果都是字符串为空,则该函数还应返回true,如果您没有此语句,则不会发生这种情况。

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

i表示您在str1中找到的str2的字符数(按顺序)。因此,如果i等于第一个字符串的长度,那么您就知道已经找到了str1的所有字符:因此继续循环是没有意义的,因为找不到其他东西了。因此,是时候以积极的结果退出该职能了。

替代

您可以使循环条件包含此“退出”条件的求反,这样就不再需要if

function isSubsequence(str1,str2) {
  let i = 0;
  // Continue as long as there are characters to compare...
  for (let j = 0; i < str1.length && j < str2.length; j++) {
    if (str2[j] === str1[i]) i++;
  }
  // Now return true if,and only when,all of str1 was found in str2
  return i === str1.length;
}