思考过程:
如果s(长度n)满足条件,且子串sub长度为k,那么一定满足:1.n%k==0;2.1<=k<=n/2;3.s的前k位,即为sub。所以就从1到n/2遍历s的前k位子串,判断是否能由sub组成s。
代码实现:
public boolean repeatedSubstringPattern(String s) {
if (s == null || s.length() < 2) {
return false;
}
for (int i = 1; i <= s.length() / 2; i++) {
if (s.length() % i == 0) {
int num = s.length() / i;
String sub = s.substring(0, i);
String tem = "";
for (int j = 0; j < num; j++) {
tem += sub;
}
if (s.equals(tem)) {
return true;
}
}
}
return false;
}
执行结果:
执行用时870ms,内存消耗41.2MB,性能太差。
算法复杂度分析:
时间复杂度O(n²),空间复杂度O(n)。
优化:
在判断是否能由sub组成s时,可以使用replace方法处理,代码如下:
public boolean repeatedSubstringPattern2(String s) {
if (s == null || s.length() < 2) {
return false;
}
for (int i = 1; i <= s.length() / 2; i++) {
if (s.length() % i == 0) {
String sub = s.substring(0, i);
if (s.replace(sub, "").length() == 0) {
return true;
}
}
}
return false;
}
执行结果:
性能有所提升,时间复杂度为O(n)。
解法一和我的思路差不多,代码也和第一版相似
解法2,3,4没太看懂(待续。。。)