/************************************************************************
* Implement strStr().
*
* Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack.
*
************************************************************************/
方法一:暴力搜索算法
int strStr(string haystack, string needle) {
int hlen=haystack.size(),nlen=needle.size();
int i=0,j=0;
while (i<hlen&&j<nlen) {
if (haystack[i]==needle[j]) {
++i;++j;
}
else {
i=i-j+1;
j=0;
}
}
return (j==nlen) ? i-j:-1;
}
方法二:KMP算法
void NextArrayCal(string &str,vector<int> &next)
{
int j=0,k=-1;
next[0]=-1;
while(j<str.size()-1)
{
if(k==-1||str[j]==str[k])
{
j++,k++;
if(str[j]!=str[k])
next[j]=k;
else
next[j]=next[k];
// next[j]=k; //可不要
}
else
k=next[k];
}
}
int strStr(string haystack, string needle) {
int hlen=haystack.size(),nlen=needle.size();
if (nlen == 0) return 0;//一定注意要有,因为调用函数中有
int i=0,j=0; //next[0]=-1;
vector<int>next(nlen);
NextArrayCal(needle,next);
while (i<hlen&&j<nlen) {
if (j==-1||haystack[i]==needle[j]) {
++i;++j;
}
else
j=next[j];
}
return (j==nlen) ? i-j:-1;
}