题目
每日一题中的easy题,但是其实还蛮有意思的;
我的方法很蠢,首先我们知道字符串的长度一定是子串的倍数,那么就去每种长度的子串都去尝试,将某一长度的字串*(字符串长度/字串长度)和原字符串进行比较,若相同说明这个字符串是可以由重复字串组合成的!
class Solution {
public:
bool repeatedSubstringPattern(string s) {
bool res = false;
string str = "";
for(int i=1;i<=s.size()/2;i++)
{
str.push_back(s[i-1]);
string str_tmp = str;
if(s.size()%i!=0)
continue;
string tmp = str;
for(int m=0;m<(s.size()/i)-1;m++)
str_tmp += tmp;
if(str_tmp == s)
return true;
}
return res;
}
};
但是效率感人,因为这个方法需要每次将子串加很多次,而且很浪费内存;
可以在原本的字符串上进行比较,加入子串的长度为i,那么只要:
s[j]!=s[j-i]
说明无法由重复子串组成!
class Solution {
public:
bool repeatedSubstringPattern(string s) {
for(int i=1;i*2<=s.size();++i)
{ if(s.size()%i == 0){
bool res = true;
for(int j=i;j<s.size();++j)
{
if(s[j]!=s[j-i])
{ res = false;
break;
}
}
if(res == true)
return true;
}
}
return false;
}
};
还有一种很牛逼的方法,我肯定是想不到的,对2*s字符串进行”掐头去尾“:
class Solution {
public:
bool repeatedSubstringPattern(string s) {
return (s + s).find(s, 1) != s.size();
}
};