一、28. 实现 strStr()
本题主要是理解KMP算法,主要是最长公共前缀如何计算的,在循环遍历过程中,应该怎么遍历数据。具体讲解可以看代码随想录的讲解。代码随想录 (programmercarl.com)
1 next数组的获取
int strStr(char* haystack, char* needle) {
//next数组获取
int len = strlen(needle);
int i = 0;
int* next = (int*)malloc(sizeof(int)*len);
next[0] = 0;
for(int j = 1;j < len; j++)
{
while(i > 0 && needle[i] != needle[j])
{
i = next[i -1];
}
if(needle[i] == needle[j])
{
i++;
}
next[j] = i;
}
int n = 0;
int arrlen = strlen(haystack);
for(int m = 0; m < arrlen; m++)
{
/**数据不匹配**/
while(n > 0 && haystack[m] != needle[n])
{
n = next[n -1];
}
/**数据匹配**/
if(haystack[m] == needle[n])
{
n++;
}
if(n == len)
{
return (m - len + 1);
}
}
return -1;
}
二、459.重复的子字符串
首先需要获取next数组,根据代码随想录的讲解,len - next[size -1]就是重复子串的长度,因此,如果len %(len - next[size -1]),那么肯定能全部重复。
bool repeatedSubstringPattern(char* s) {
//next数组获取
int len = strlen(s);
int i = 0;
int* next = (int*)malloc(sizeof(int)*len);
next[0] = 0;
for(int j = 1;j < len; j++)
{
while(i > 0 && s[i] != s[j])
{
i = next[i -1];
}
if(s[i] == s[j])
{
i++;
}
next[j] = i;
}
return (i > 0 && len % (len - next[len -1]) == 0);
}