力扣刷题序号459.重复的子字符串——C语言实现

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成

  1. 思路与算法:根本思路——区间移动
    (1)先判断一定不是由子串构成的情况:即输入的母串长度为0或1的情况;
    (2)当母串长度 >= 2时,需考虑多种情况,需枚举算法,先遍历整个母串的长度,并记录子串的长度count_len;
    (3)满足母串第一个元素与第 i 个元素一致并且母串长度是子串长度的倍数后,说明此母串有可能是由子串重复多次构成的;
    (4)再次遍历母串,但范围缩减到(母串 - 子串)的长度,判断第 j 个元素与第 (j + count_len)的元素是否匹配,如果每个元素都能匹配,说明此母串是由子串多次循环构成的,如果有一个元素不匹配,则说明此母串不是由子串组成的,直接退出遍历;
    (5)若母串是由子串多次循环构成的,则最后需判断下循环的次数是否相等,若不判断,很有可能再次进循环重新遍历,导致非期望结果;
  2. 代码实现:
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值