2 回答
TA贡献1906条经验 获得超3个赞
为什么需要:
if (!str1) return true;
这是一个边界案例。它检查第一个字符串是否为空。有人会问:空字符串是否总是另一个字符串的子序列?答案是:是的。
可以使该语句看起来与另一个if
语句相同:if (i === str1.length) return true;
。那也行。它表明实际上它正在执行相同的测试,但是对于i
0 的情况。
如果保证第二个字符串不为空,则实际上不需要此语句,因为在这种情况下,循环将进行第一次迭代,并且其他语句的条件将为真,因此该函数仍会返回真if
。但是,如果两个字符串都是空的,该函数也应该返回 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;
}
TA贡献1776条经验 获得超12个赞
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=3
str1[3] = '垃圾值'
str2[3] = 'd'
它们不匹配,所以我们不断增加 j 的值,但我们不会更新 i 的值。因为if (str2[j] === str1[i]) i++;
。在那种情况下,我们将遍历 str2 长度,最后我们将返回 false。这是一个错误的结果。
添加回答
举报