版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
运行结果:
方法二:方法一我这样的渣渣想到的解法。再看看大神的解法。
先上代码:
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,中间肯定搜不到这个字符串。