next数组
求解步骤
1.初始化
2.处理s[i] != s[j] 的情况
3.处理s[i] == s[j] 的情况
4.更新next数组
注意
1.要先处理s[i] != s[j] 再处理s[i] == s[j] ,否则会略过j回退过程中与s[j] == s[i] 的情况
2.处理s[i] != s[j]情况时注意用while,因为回退可能是多步的
重复的字符子串
思路一(枚举)
思路二(匹配)
题解
class Solution {
public:
bool repeatedSubstringPattern(string s) {
string t = s + s;
string t1(t,1,t.size() - 2);
if(t1.find(s) != string :: npos)
return true;
return false;
}
};
注意
1.string的find函数使用时,若找到则返回该子字符串首次出现时其首字符的索引;否则,返回string::npos
2.可以通过构造函数对字符串进行复制
for(int i = 0;i < s.size();i++)
{
string s1(s,i);
string s2(s,0,i);
cout<<s1<<endl;
cout<<s2<<endl;
cout<<"****"<<endl;
}
abcabc
****
bcabc
a
****
cabc
ab
****
abc
abc
****
bc
abca
****
c
abcab
****
思路三
利用next数组(存放最长相同前后缀长度)
数组长度为:len。
如果len % (len - (next[len - 1] + 1)) == 0 ,则说明数组的长度正好可以被 (数组长度-最长相等前后缀的长度) 整除 ,说明该字符串有重复的子字符串。