leetcode-28 找出字符串中第一个匹配项的下标
解法一
暴力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
var strStr = function (haystack, needle) { let i = 0; j = 0; while (i < haystack.length) { if (haystack[i] === needle[j]) { i++; j++; if (j === needle.length) { return i - j; } } else { i = i - j + 1; j = 0; } } return -1; };
|
解法二
KMP
构建next数组
如果不相等j就回退
直到j不能在回退(为零),next[i] = j
主串和模式串匹配流程
不回退主串,只回退模式串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
var strStr = function (haystack, needle) { function buildNext(pattern) { const next = Array(pattern.length).fill(0); let j = 0; for (let i = 1; i < pattern.length; ++i) { while (j > 0 && pattern[i] !== pattern[j]) { j = next[j - 1]; } if (pattern[i] === pattern[j]) { j++; } next[i] = j; } return next; } function kmpSearch(text, pattern) { if (!pattern) return 0; const next = buildNext(pattern); let j = 0; for (let i = 0; i < text.length; ++i) { while (j > 0 && text[i] !== pattern[j]) { j = next[j - 1]; } if (text[i] === pattern[j]) { j++; } if (j === pattern.length) { return i - j + 1; } } return -1; } return kmpSearch(haystack, needle); };
|