题目
每日一题中的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();
}
};
本文探讨了三种检测字符串是否由重复子串组成的算法。首先介绍了一种直观但效率较低的方法,通过比较原字符串与重复子串的组合;其次,提出了一种改进方案,直接在原字符串上进行比较,避免了内存浪费;最后,分享了一种巧妙的方法,利用2*s字符串进行‘掐头去尾’,实现快速判断。
879

被折叠的 条评论
为什么被折叠?



