Implement strStr():
Implement strStr().
Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack.
KMP是基本功啊!但还是一下init里有个地方写错,牢记啊牢记!!
class Solution {
public:
char *strStr(char *hay, char *need) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if ( !hay || !need )
return NULL;
int nH=strlen(hay);
int nN=strlen(need);
if ( nN >nH )
return NULL;
if (nN==0)
return hay;
vector<int> pre(nN,-1);
init(pre,need,nN);
int pN=-1;
for(int pH=-1;pH<nH;pH++)
{
while(pN!=-1&&hay[pH+1]!=need[pN+1])
pN=pre[pN];
if(hay[pH+1]==need[pN+1])
pN++;
if ( pN == nN-1 )
return &hay[pH-nN+2];
}
return NULL;
}
void init(vector<int>& pre,char* s,int n)
{
int p;
pre[0]=-1;
for(int i=1;i<n;i++)
{
p=pre[i-1];
while(p!=-1&&s[p+1]!=s[i])
p=pre[p];
if ( s[p+1]==s[i])
pre[i]=p+1;
else
pre[i]=-1;
}
}
};