LeetCode392判断子序列解法中if(j===t.length)语句作用咨询
你的理解完全正确,我们可以结合双指针的解法逻辑拆解这段代码的执行规则:
核心逻辑说明
这个解法用双指针实现子序列匹配:
- 指针
i记录字符串s的已匹配位置,指针j记录字符串t的已遍历位置 - 循环条件
i < s.length含义为:只要还没匹配完s的所有字符,就继续遍历t查找匹配项
if(j===t.length)的作用
这段判断的逻辑和你猜测的完全一致:
- 如果指针
j已经走完了t的所有字符,说明把t全部遍历完都没匹配完s的全部字符,s不可能是t的子序列,直接返回false - 如果在
j遍历完t之前,s的所有字符已经全部匹配完成(i等于s的长度),会直接跳出循环执行末尾的return true,此时这个返回false的判断语句完全不会被触发
用你提供的两个示例验证:
示例1:s = "abz",t = "ahbgdc"
let s="abz" let t="ahbgdc" function isSubsequence(s, t) { let i=0; let j=0; while(i<s.length){ if(j===t.length){ console.log("t.length is " + t.length) return false; } if(s[i]===t[j]){ i++; } j++; console.log("j is "+ j); } return true; } console.log(isSubsequence(s, t));
执行过程:匹配完s的前两个字符a、b后,i停在2,需要匹配第三个字符z;j遍历完t的所有字符后值为6,等于t的长度6,进入if(j===t.length)分支返回false,符合预期。
示例2:s = "abc",t = "ahbgdc"
let s="abc" let t="ahbgdc" function isSubsequence(s, t) { let i=0; let j=0; while(i<s.length){ if(j===t.length){ return false; } if(s[i]===t[j]){ i++; } j++; console.log("j is "+ j); console.log("t.length is " + t.length) } return true; } console.log(isSubsequence(s, t));
执行过程:匹配完s的三个字符a、b、c后,i的值变为3,等于s的长度3,循环条件i < s.length不成立,直接跳出循环返回true,此时j的值为5,还没到t的长度6,if(j===t.length)分支不会被触发。
内容的提问来源于stack exchange,提问作者Kevin Orara
相关产品推荐
相关产品推荐

