Implement strStr().
Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack.
朴素匹配好像超时,只能改用kmp了。关于kmp算法就不多说了,是很经典的问题了,我只想补充一下,kmp有两种写法,有一个优化版本的。这两个版本不同之处在于求next数组的不同方法,我使用的是一般的next数组,next数组就是保存最长前缀和后缀的匹配重度。
如果不理解kmp,搜下到处都有了,好久不看,自己推next推了很久才想起来。
class Solution {
public:
void get_n(const char * pattern,int *p,int n)
{
p[0]=-1;
for(int i=1;i<n;i++)
{
int j=p[i-1];
while(j>=0&&pattern[j+1]!=pattern[i])
j=p[j];
if(pattern[j+1]==pattern[i])
p[i]=j+1;
else
p[i]=-1;
}
}
char *strStr(char *haystack, char *needle) {
if(!haystack||!needle)
return NULL;
int m=0,n=0;
while(haystack[m])m++;
while(needle[n])n++;
if(m<n)
return NULL;
int next[n];
get_n(needle,next,n);
int i=0,j=0;
while(i<m&&j<n)
{
if(haystack[i]==needle[j])
{
i++;j++;
}
else
if(j==0)
i++;
else
{
j=next[j-1]+1;
}
}
if(j==n)
return haystack+i-j;
return NULL;
}
};
如有不正之处请指正。