为何在字符串匹配代码的if语句中使用[i+j]和j+1?
字符串中第一个匹配项的下标:代码关键语句拆解
先看完整的实现代码:
let strStr = (haystack, needle) => { // 遍历主字符串 for (let i = 0; i < haystack.length; i++) { // 遍历匹配字符串 for (let j = 0; j < needle.length; j++) { if (needle[j] !== haystack[i + j]) break; if (j + 1 === needle.length) { return i } } } return -1 }; strStr('sadbutsad', 'sad')
下面拆解你看不懂的两个if语句:
1. if (needle[j] !== haystack[i + j]) break;
这行是用来及时终止无效的匹配尝试:
- 外层循环的
i是主字符串haystack里当前尝试匹配的起始位置 - 内层循环的
j是匹配字符串needle里正在对比的字符下标 haystack[i + j]就是主字符串中,从i开始数的第j个字符,刚好和needle[j]是对应位置- 只要发现某一对字符不相等,就说明从
i这个位置开始,不可能匹配出完整的needle,直接跳出内层循环,去试主字符串的下一个起始位置(i+1)
2. if (j + 1 === needle.length) return i;
这行是用来确认匹配成功并返回结果:
- 内层循环的
j从0开始,每成功匹配一个字符就会加1 - 当
j + 1等于needle的长度时,说明j已经遍历到了needle的最后一个字符(比如needle长度是3,j走到2的时候,j+1就等于3) - 这意味着从
i开始的连续字符,完全和needle对上了,直接返回起始下标i,整个函数结束
内容的提问来源于stack exchange,提问作者Housni
相关产品推荐
相关产品推荐

