//最原始的暴力法
class Solution {
public:
int strStr(string haystack, string needle) {
if(needle.size()==0)
return 0;
if(haystack.size()==0){
return -1;
}
for(int i=0;i<haystack.length();++i){
if(haystack[i]==needle[0]){
int j=1;
for(int k=i+1;j<needle.length()&&k<haystack.length();++j,++k){
if(haystack[k]!=needle[j])
break;
}
if(j==needle.length())
return i;
}
}
return -1;
}
};
//kmp算法
class Solution {
public:
int strStr(string haystack, string needle) {
if(needle.size()==0)
return 0;
vector<int>next(needle.size(),-1);
getnext(next,needle);
int i=0;
int j=0;
while(i<int(haystack.size())&&j<int(needle.size())){
//cout<<i<<'-'<<j<<' ';
if(j==-1||needle[j]==haystack[i]){
++i;++j;
}else
j=next[j];
//cout<<j<<needle.size();
}
if(j==needle.size()){
return i-needle.size();
}
return -1;
}
void getnext(vector<int>&next,string&needle){
int size=needle.size()-1;
int i=0;
int j=-1;
//next[0]=-1;
while(i<size){
if(j==-1||needle[i]==needle[j]){
i++;j++;
if(needle[i]!=needle[j])
next[i]=j;
else
next[i]=next[j];
}else
j=next[j];
}
}
};