28. 实现 strStr()
KMP精髓:模式串的前后缀性质
回退的部分还不是很懂,再看看回退
void get_next(int* next,char* s){
int i,j;
j = 0;
next[0] = 0;
for(i=1;i<strlen(s);i++)
{
while(j>0 && s[i]!=s[j])
{
j = next[j-1];
}
if(s[i]==s[j])
{
j++;
}
next[i]=j;
}
}
int strStr(char * haystack, char * needle){
int i,j;
int len1,len2;
len1=strlen(haystack);
len2=strlen(needle);
int *next = malloc(sizeof(int)*len2);
get_next(next,needle);
i = 0;
j = 0;
while(i<len1)
{
while(j>0&&haystack[i]!=needle[j])
{
j=next[j-1];
}
if(haystack[i]==needle[j])
{
j++;
}
if(j==len2)
{
return i+1-len2;
}
i++;
}
return -1;
}
459.重复的子字符串
bool repeatedSubstringPattern(char * s)
{
//KMP
int flag = 1;
int i,j;
j=0;
int len = strlen(s);
int* next = malloc(sizeof(int)*len);
next[0] = 0;
//求next数组,把整个的最长相等前后缀求出来之后剩下的就是重复的
for(i=1;i<len;i++)
{
while(s[i]!=s[j]&&j>0)
{
j=next[j-1];
}
if(s[i]==s[j])
j++;
next[i]=j;
}
int a = len-next[len-1];
//a就是前后剩下的长度
if(next[len-1]==0)
flag=0;
else
{
for(i=0;i<a;i++)
{
if(s[len-a+i]!=s[i])
{
flag = 0;//不是了
break;
}
}
}
if(flag == 0)
return false;
else
return true;
}