目录
kmp已经整了很多次了,从一开始的不懂到之前一次的似懂非懂,这次再刷字符串算法,一定搞懂
寄,又有点糊里糊涂的
感悟
有点晕,next数组和整体的顺序上已经理解了
存在的问题
-
用next数组查找的时候要用while循环去查找,因为如果用if来查找,匹配到本次不一样,回退后仍然可能不一样所以要用while直到一样或者结束
-
next数组的构建过程中同样要用while做循环检测,然后slowptr=next[slowptr-1]
class Solution {
public:
int strStr(string haystack, string needle) {
int n=haystack.length();
int m=needle.length();
vector<int> next(m,0);
int slowptr=0;
int fastptr=1;
for(;fastptr<m;fastptr++)
{
while(slowptr>0&&needle[fastptr]!=needle[slowptr])
{
slowptr=next[slowptr-1];
}
if(needle[fastptr]==needle[slowptr])
{
next[fastptr]=slowptr+1;
slowptr++;
}
}
for(int 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;
}
};
标签:slowptr,int,needle,next,算法,KMP,haystack,fastptr
From: https://www.cnblogs.com/liviayu/p/17998942