2 回答

TA貢獻1906條經驗 獲得超3個贊
為什么需要:
if (!str1) return true;
這是一個邊界案例。它檢查第一個字符串是否為空。有人會問:空字符串是否總是另一個字符串的子序列?答案是:是的。
可以使該語句看起來與另一個if
語句相同:if (i === str1.length) return true;
。那也行。它表明實際上它正在執(zhí)行相同的測試,但是對于i
0 的情況。
如果保證第二個字符串不為空,則實際上不需要此語句,因為在這種情況下,循環(huán)將進行第一次迭代,并且其他語句的條件將為真,因此該函數(shù)仍會返回真if
。但是,如果兩個字符串都是空的,該函數(shù)也應該返回 true,如果您沒有此語句,則不會發(fā)生這種情況。
我也沒有得到這一行:
if (i===str1.length) return true;
i
str1
代表你在其中找到的字符數(shù)str2
(按順序)。所以如果i
等于第一個字符串的長度,那么你就知道你已經找到了 : 的所有字符,str1
所以繼續(xù)循環(huán)是沒有意義的,因為沒有其他東西可以找到。因此,是時候以積極的結果退出該功能了。
選擇
你可以讓循環(huán)條件包括這個“退出”條件的否定,這樣你就不再需要了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;
當?shù)谝粋€字符串為空字符串時,此語句返回 true。因為我們可以通過刪除另一個字符串的所有字符來導出一個空字符串。這就是為什么空字符串是任何字符串的子序列。除非明確提到我們正在尋找一個非空子序列。
if (i===str1.length) return true;
當我們檢查兩個字符串的字符是否相等時,如果我們到達第一個字符串的末尾并且所有前面的字符都相等,我們可以說 str1 是 str2 的子序列。此時我們需要從函數(shù)中返回,否則,你將無法在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 的末尾?,F(xiàn)在,如果我們不返回,那么會發(fā)生什么?
我=3,j=3
str1[3] = '垃圾值'
str2[3] = 'd'
它們不匹配,所以我們不斷增加 j 的值,但我們不會更新 i 的值。因為if (str2[j] === str1[i]) i++;
。在那種情況下,我們將遍歷 str2 長度,最后我們將返回 false。這是一個錯誤的結果。
添加回答
舉報