KMP的子串长n,模式串长m,复杂度o(m+n),朴素做法的复杂度o((n-m+1)*m)
觉得大话数据结果上面这个讲得特别好
改进版本的KMP
leetcode
28. Implement strStr()
class Solution {
public:
void getnext(string str,int next[])
{
int i=1;
int j=0;
next[1]=0;
int str0=str.length()-1;
while(i<=str0)
{
if(j==0||str[i]==str[j])
{
++j;
++i;
next[i]=j;
}
else
{
j=next[j];
}
}
}
int kmp(string s,string t)
{
int cnt=0;
//int *next=new int[1000002];
int next[1000002];
getnext(t,next);
int i=1;
int j=1;
int s0=s.length()-1,t0=t.length()-1;
int idx=-1;
while(i<=s0&&j<=t0)
{
if(j==0||s[i]==t[j])
{
++i;
++j;
}
else
{
j=next[j];
}
if(j>t0)
{
cnt++;
idx=i-t0-1;
break;
}
}
return idx;
}
int strStr(string haystack, string needle) {
if(haystack.length()==0&&needle.length()<=haystack.length()||needle.length()==0) return 0;
string tmpt="#",tmps="#";
tmpt+=needle;
tmps+=haystack;
return kmp(tmps, tmpt);
}
};
class Solution {
public:
void getnext(string str,int next[])
{
int i=1;
int j=0;
next[1]=0;
int str0=str.length()-1;
while(i<=str0)
{
if(j==0||str[i]==str[j])
{
++j;
++i;
if(str[i]!=str[j])
next[i]=j;
else
next[i]=next[j];
}
else
{
j=next[j];
}
}
}
int kmp(string s,string t)
{
int cnt=0;
//int *next=new int[1000002];
int next[1000002];
getnext(t,next);
int i=1;
int j=1;
int s0=s.length()-1,t0=t.length()-1;
int idx=-1;
while(i<=s0&&j<=t0)
{
if(j==0||s[i]==t[j])
{
++i;
++j;
}
else
{
j=next[j];
}
if(j>t0)
{
cnt++;
idx=i-t0-1;
break;
}
}
return idx;
}
int strStr(string haystack, string needle) {
if(haystack.length()==0&&needle.length()<=haystack.length()||needle.length()==0) return 0;
string tmpt="#",tmps="#";
tmpt+=needle;
tmps+=haystack;
return kmp(tmps, tmpt);
}
};