一、题目描述
二、思路
先计算出字符串前缀表,当满足题意时,最长相等前后缀的值为 next [ sLen - 1 ] ,并且满足 sLen - next [ sLen - 1 ] 的值为最小重复子串的长度 minLen,此时 sLen % minLen == 0。如图:
三、解题过程
-
实现计算字符串前缀表接口函数
void getNext(char* s, int* next, int sLen){
int j = 0, i = 1;
next[j] = 0;
for(; i < sLen; i++){
while(j - 1 >= 0 && s[j] != s[i]){
j = next[j - 1];
}
if(s[j] == s[i]) j++;
next[i] = j;
}
-
得到最长相等前后缀长度后判断
bool repeatedSubstringPattern(char * s){
int sLen = strlen(s);
int* next = (int*)malloc(sizeof(int) * sLen);
getNext(s, next, sLen);
int minLen = sLen - next[sLen - 1];
if(next[sLen - 1] != 0 && sLen % minLen == 0) return true;
return false;
}
四、代码
void getNext(char* s, int* next, int sLen){
int j = 0, i = 1;
next[j] = 0;
for(; i < sLen; i++){
while(j - 1 >= 0 && s[j] != s[i]){
j = next[j - 1];
}
if(s[j] == s[i]) j++;
next[i] = j;
}
}
bool repeatedSubstringPattern(char * s){
int sLen = strlen(s);
int* next = (int*)malloc(sizeof(int) * sLen);
getNext(s, next, sLen);
int minLen = sLen - next[sLen - 1];
if(next[sLen - 1] != 0 && sLen % minLen == 0) return true;
return false;
}
时间复杂度:O(n),空间复杂度:O(n)。