给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成
- 思路与算法:根本思路——区间移动
(1)先判断一定不是由子串构成的情况:即输入的母串长度为0或1的情况;
(2)当母串长度 >= 2时,需考虑多种情况,需枚举算法,先遍历整个母串的长度,并记录子串的长度count_len;
(3)满足母串第一个元素与第 i 个元素一致并且母串长度是子串长度的倍数后,说明此母串有可能是由子串重复多次构成的;
(4)再次遍历母串,但范围缩减到(母串 - 子串)的长度,判断第 j 个元素与第 (j + count_len)的元素是否匹配,如果每个元素都能匹配,说明此母串是由子串多次循环构成的,如果有一个元素不匹配,则说明此母串不是由子串组成的,直接退出遍历;
(5)若母串是由子串多次循环构成的,则最后需判断下循环的次数是否相等,若不判断,很有可能再次进循环重新遍历,导致非期望结果; - 代码实现:
bool repeatedSubstringPattern(char * s)
{
unsigned int s_len = strlen(s);
unsigned int count_len = 0;
unsigned int loop = 0;
bool ret = false;
do
{
if (0 == s_len || 1 == s_len)
{
break;
}
else
{
for (int i = 1; i < s_len; i++)
{
count_len++;
if ((s[0] == s[i]) && (0 == s_len % count_len))
{
for (int j = 0; j < (s_len - count_len); j++)
{
loop++;
if (s[j] == s[j + count_len])
{
ret = true;
}
else
{
ret = false;
break;
}
}
}
if (((s_len - count_len) == loop) && (0 != loop))
{
break;
}
}
}
}while(0);
return ret;
}