【力扣459题】代码详解

前言

本题采用暴力算法,不过在代码随想录中最后有采用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,因为我们之前都是假设成立,走到最后什么字符串不是循环字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值