class Solution {
public:
int strStr(string haystack, string needle) {
//用KMP算法,KMP的具体过程已写在博客
//大致来说,首先是得到这个字符串的前缀表
//然后把前缀表后移,处理成前缀表第一个元素是-1
//再KMP
if(needle.size() == 0)
return 0;
int pos = 0;
pos = KMP(haystack,needle);
return pos;
}
void prefix(int prefix_table[],string s,int n)
{
prefix_table[0] = 0;
int i = 1;
int len = 0;
while(i<n)
{
if(s[i] == s[len])
{
len++;
prefix_table[i] = len;
i++;
}
else
{
if(len>0)
{
len = prefix_table[len-1];
}
else
{
prefix_table[i] = len;
i++;
}
}
}
}
void move(int prefix_table[],int n)
{
for(int i = n-1;i>0;--i)
prefix_table[i] = prefix_table[i-1];
prefix_table[0] = -1;
}
int KMP(string t,string p)//文本,模式
{
int m = t.size();//文本长度
int n = p.size();//模式长度
int prefix_table[n] = {0};
prefix(prefix_table,p,n);
move(prefix_table,n);
int i = 0;
int j = 0;
while(i<m)
{
if(j == n-1 && t[i]==p[j])
return (i-j);
if(t[i] == p[j])
{
i++;
j++;
}
else
{
j = prefix_table[j];
if(j==-1)
{
i++;
j++;
}
}
}
return -1;
}
};