字符串:KMP算法,重复的子字符串
普通的方法,双指针逐个比较:
class Solution {
public:
bool repeatedSubstringPattern(string s) {
for(int i = 1; i * 2 <= s.size(); i++)
{
if(s.size() % i == 0)
{
int begin1 = 0;
int begin2 = begin1 + i;
bool match = true;
while(begin2 < s.size())
{
if(s[begin1] != s[begin2])
{
match = false;
break;
}
begin1++;
begin2++;
}
if(match)
{
return true;
}
}
}
return false;
}
};
KMP方法,在一个串中查找是否出现过另一个串,这是KMP的看家本领。如果len % (len - (next[len - 1])) == 0 ,则说明 (数组长度-最长相等前后缀的长度) 正好可以被 数组的长度整除,说明有该字符串有重复的子字符串。
举例:
字符串:ababab
next数组:001234
6 % (6 - 4)== 0,含有重复子串
字符串:abcdab
next数组:000012
6 % (6 - 2)!= 0,不含有
代码如下:注意next[len - 1] != 0
class Solution {
public:
bool repeatedSubstringPattern(string s) {
vector<int> next(s.size(), 0);
getNext(next, s);
int len = s.size();
if(next[len - 1] != 0 && len % (len - next[len - 1]) == 0)
return true;
return false;
}
void getNext(vector<int> &next, string s)
{
//初始化:
int j = 0;
for(int i = 1; i < s.size(); i++)
{
while(j > 0 && s[i] != s[j])
{
j = next[j - 1];
}
if(s[i] == s[j])
{
j++;
}
next[i] = j;
}
}
};