题目--KMP算法掌握度20%
给你两个字符串 haystack
和 needle
,请你在 haystack
字符串中找出 needle
字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle
不是 haystack
的一部分,则返回 -1
。
代码
1.1朴素我的原版(代码习惯)
/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function(haystack, needle) {
let s=0;
for(;s<=haystack.length;s++){
let i=s,j=0;
while(j<needle.length ){
if(haystack[i]===needle[j]){
i++;
j++;
}else{
break;
}
}
if(j===needle.length) return s;
}
return -1;
};
1.2朴素优化后
/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function(haystack, needle) {
let s=0;
const n = haystack.length,m=needle.length;
for(;s<=n-m;s++){
let i=s,j=0;
while(j<m && haystack[i]===needle[j]){
i++;
j++;
}
if(j===needle.length) return s;
}
return -1;
};
注意点:
- for结构
for(;s<=haystack.length;s++)
- break的使用
while(j<needle.length ){
if(haystack[i]===needle[j]){
i++;
j++;
}else{
break;
}
}
1.3KMP算法
/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function(haystack, needle) {
const n=haystack.length,m = needle.length;
if(m===0){
return 0;
}
const next = new Array(m).fill(0);
for(let i =1,j=0;i<m;i++){
while(j>0 && needle[i]!= needle[j]){
j=next[j-1];
}
if(needle[i] === needle[j]){
j++;
}
next[i] = j;
}
for(let i=0,j=0;i<n;i++){
while(j>0&&haystack[i]!=needle[j]){
j=next[j-1];
}
if(haystack[i]===needle[j]){
j++;
}
if(j=== m){
return i-m+1;
}
}
return -1;
};
KMP算法可以理解,但nexts数组的生成有待进一步理解;
2,学习与总结
- 朴素算法基本可以自己实现;
- 巩固了KMP算法思想,但KMP算法next数组生成的代码实现,有待进一步理解!
补充
进一步理解KMP中next的代码实现,用来帮助自己回忆理解过程
告诫自己:贵在坚持!