前言
本题采用暴力算法,不过在代码随想录中最后有采用kmp算法实现的,但是本人对kmp算法只是初有了解,对其如何应用到本题的底层思路还是云里雾里,所以本题不采用kmp算法。
思路
①确定重复字符串的长度(这里采用循环遍历,从1到字符串长度的一半,因为最短是1,最长也就字符串一半,这里奇数偶数的长度理论上应该要分开处理,但是通过取余手段巧妙跳过奇偶数考虑,下面会展开讲)
②判断是否是该长度的字符串是重复子串
代码
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int i;
if(s.size()==1)
return false;
for(i=1;i<=s.size()/2;i++)
{
if(s.size()%i!=0)
continue;
int j;
for(j=0;j<s.size();j++)
{
if(s[j]!=s[j%i])
{
break;
}
}
if(j==s.size())
{
return true;
}
}
return false;
}
};
代码详解
int i;
if(s.size()==1)
return false;
定义变量i,如果字符串是重复字符串,i表示重复子串的长度。
判断语句是排除字符串长度为1的情况,长度为1在题目中被定义为飞重复字符串。
for(i=1;i<=s.size()/2;i++)
{
if(s.size()%i!=0)
continue;
int j;
for(j=0;j<s.size();j++)
{
if(s[j]!=s[j%i])
{
break;
}
}
if(j==s.size())
{
return true;
}
}
最外层for循环表示:假设字符串是循环字符串,每次循环判断长度为i(1<i<=字符串长度整除二,这里奇偶数都满足)的子串是不是重复子串。
第一个判断语句,条件有取余操作 表示:跳过不能被子串长度整除的组合,因为由子串组成必定字符串长度可以被子串的长度整除,先跳过可以节省计算量。
内层循环与它紧接着的判断语句用于确认长度i的子串是否是字符串的循环子串,只要由一个字符不满足,判断语句都不成立,如果成立就返回真。
在代码最后返回false,因为我们之前都是假设成立,走到最后什么字符串不是循环字符串。