leetcode. 459. 重复的子字符串

459. 重复的子字符串

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1:

输入: "abab"

输出: True

解释: 可由子字符串 "ab" 重复两次构成。
示例 2:

输入: "aba"

输出: False
示例 3:

输入: "abcabcabcabc"

输出: True

解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

题解:

首先需要充分理解题意,即所谓重复字符串有怎样的性质呢?
我们不妨设重复字符串为s,设其可以由子串s1重复多次得到。
1.显而易见的是,s一定是s1成倍数关系。
2.s1起点一定为s的头部位置,或可以平移到此位置。
3.s[i] == s[i-n]成立。
对于性质1不再解释。
对于性质2:
我们可以反证,即如果s1起点和s头部位置对应的字符不同时,由于性质1我们可知最后剩余的一部分就是s头部的几个位置,而由于s1与其不同所以必定不可能组成重复字符串s。
对于性质3:
可以由性质1发现s可以分成n个s1,因此他们可以理解成为周期性排列。

代码:

bool repeatedSubstringPattern(char * s){
    for(int i=0;i*2<strlen(s);i++)
//为了避免出现i<strlen(s)/2,因为这样的话如果s长度为1,那么1/2为0了,所以尽量不要出现除法
    {
        int n = i+1;//起点已固定,我们遍历i是为了找终点
        bool flag = 0;//使用布尔类型做标志量更易
        if(strlen(s)%n!=0)
        {
            continue;
        }
        for(int j=i+1;j<strlen(s);j++)//此为验证我们找的子串是不是可以满足题意
        {
            if(s[j]!=s[j-n])
            {
                flag = 0;
                break;
            }
            else
            {
                flag = 1;
            }
        }
        if(flag==1)
        {
            return 1;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向光.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值