Implement strStr().
Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
Example 1:
Input: haystack = "hello", needle = "ll" Output: 2
Example 2:
Input: haystack = "aaaaa", needle = "bba" Output: -1
class Solution {
public:
//普通字符串匹配
int strStr(string haystack, string needle) {
if(haystack.empty()&&needle.empty())
return 0;
int n = haystack.length();
int m = needle.length();
int i;
for(i=0; i<n; i++)
{
int j;
for(j=0; j<m; j++)
{
if(needle[j]!=haystack[i+j])
break;
}
if(j==m)
break;
}
return i==n ? -1 : i;
}
//KMP算法
void MakeNext(string pattern, int *next)
{
int k=0;
int m = pattern.length();
next[0] = 0;
int i=0;
for(i=1; i<m; i++)
{
while(k>0&&pattern[i]!=pattern[k])
k = next[k-1];
if(pattern[i] == pattern[k])
k++;
next[i] = k;
}
}
int strStr(string haystack, string needle) {
if((haystack.empty()|| !haystack.empty())&&needle.empty())
return 0;
int n = haystack.length();
int m = needle.length();
int *next = new int[m];
MakeNext(needle, next);
int i,p;
cout<<n<<"@"<<m<<endl;
for(i=0,p=0;i<n; i++)
{
while(p>0&&haystack[i]!=needle[p])
p = next[p-1];
if(haystack[i]==needle[p])
p++;
if(p==m)
{
cout<<"pattern"<<endl;
return i-m+1;
}
}
cout<<i<<" "<<p<<endl;
return -1;
}
};