【每日刷题】重复的子字符串

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sd4567855/article/details/86511933

day19, 重复的子字符串

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

示例 1:
输入: “abab”
输出: True
解释: 可由子字符串 “ab” 重复两次构成。

示例 2:
输入: “aba”
输出: False

示例 3:
输入: “abcabcabcabc”
输出: True
解释: 可由子字符串 “abc” 重复四次构成。 (或者子字符串 “abcabc” 重复两次构成。)

解答:两种方法。
方法一:暴力法。从i = 0 开始选择子字符串,一直到i = s.size()/2, 如果满足题目,则返回true,否则返回false.

代码:

bool repeatedSubstringPattern(string s) {
        if( s.size() <= 1)
            return false;
        
        for( int i = 1; i < s.size()/2 + 1; i++){
            string compare = s.substr(0,i);
            int j = 0;;
            for( j = i; j < s.size(); j+=i){
                if( compare == s.substr(j,i))
                    ;
                else
                    break;
            }
            if( j == s.size())
                return 1;
        }
        return 0;
    }   

运行结果:
image.png-26.3kB

方法二:方法一我这样的渣渣想到的解法。再看看大神的解法。
先上代码:

bool repeatedSubstringPattern(string s) {
        string ss = s+s;
        string ss_(ss.begin()+1,ss.end()-1);
        return ss_.find(s)<ss_.size();
    }

解释:假设子串为m,那么合法的字符串是mm…m,将两个字符串相加得到mmmm…mmmm,中间必然包含字符串mm…m。 如果一个字符串为mk1k2…knmx1…xn组成,两份相加得到mk1k2…knmx1…xnmk1…knmx1…xn,中间肯定搜不到这个字符串。


我的微信公众号

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sd4567855/article/details/86511933