题目链接:
分析:官方给出了数学推导、KMP、优化KMP等对新手及其不友好的做法,我这里提供一个简单的暴力思路,可以AC。
算法思路:题目要求给定一个字符串,问它的子串有没有可能组成它本身。要考虑到几个点
- 如果可以组成,那么子串的长度最多为题中所给字符串的一半。
- 可以由一个小子串重复若干次组成。
- 子串和主串的长度均可为奇数。
- 如果可以组成,那么主串的长度一定可以整除子串的长度。
我们采用最朴实无华的模拟方法,从主串头开始,按照长度从小到大依次选择子串,每次选好子串后,先验证和主串之间是否满足最基本的长度关系,不满足则直接尝试下一组解;如果满足则进入我们写好的循环,将子串拼接若干次,组合成和主串一样的长度,进行比较,如果二者相等则直接返回true;如果不相等则尝试下一组解。如此循环直至返回true或者循环结束返回false。
下面是参考代码:
class Solution {
public:
bool repeatedSubstringPattern(string s) {
for(int i=0;i<s.size()/2;++i){ //尝试所有可能的情况
if(s.size()%(i+1)==0){ //有拼接成功的可能
int temp=s.size()/(i+1); //计算需要拼接的次数
string t=s.substr(0,i+1); //取出需要的子串
string res=t;
for(int j=1;j<temp;++j){ //进行拼接
res+=t;
}
if(res==s) //进行比较
return true;
}
}
return false;
}
};
说实话效率一般,不过算法的思想比较好理解,尤其方便考研选手们在考场写出思路,手撕代码。