题目一:
解法一:(库函数)
解法二:(KMP算法)
KMP算法:KMP主要应用在字符串匹配上。
KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。
前缀表统一不减一:
var strStr = function(haystack, needle) {
if (needle.length === 0) {
return 0
}
const getNext = (needle) => {
let j = 0;
let next = []
next.push(j)
for(let i = 1; i < needle.length; i++) {
while (j > 0 && needle[j] !== needle[i]) {
j = next[j - 1]
}
if (needle[j] === needle[i]) {
j++
}
next.push(j)
}
return next
}
let next = getNext(needle)
let j = 0
for(let i = 0; i < haystack.length; i++) {
while (j > 0 && needle[j] !== haystack[i]) {
j = next[j - 1]
}
if (needle[j] === haystack[i]) {
j++
}
if (j === needle.length) {
return (i - needle.length + 1)
}
}
return -1
};
具体的KMP算法思想,这里就不再赘述了,请参考代码随想录中的详细讲解,十分清楚!!!
解法三:(暴力解法)
var strStr = function(haystack, needle) {
const n = haystack.length, m = needle.length;
for (let i = 0; i + m <= n; i++) {
let flag = true;
for (let j = 0; j < m; j++) {
if (haystack[i + j] != needle[j]) {
flag = false;
break;
}
}
if (flag) {
return i;
}
}
return -1;
};