2020年8月24日重复的子字符串 repeatedSubstringPattern
class Solution {
public boolean repeatedSubstringPattern(String s) {
}
}
解题思路:
根据题意,这个字符串中只能包含某一特定字符串,不能包含除该字符串以外的其他字符串,这就意味着符合条件的字符串必定符合以下特性。
如果是一个偶数长度的字符串并且符合条件,那么他必定是由偶数个相同的字符串组成,因为是偶数个,所以也可以认为是由两个字符串组成的,所以我们只需要由中间分开,再判断两边的字符串是否相等即可。
如果是一个奇数,我们可以先求出所有的约数,这两个约数必定就是两个奇数,我们尝试找出所有的约数作为子字符串的长度来尝试是否字符串相等。
代码实现:
在使用代码编写的过程中发现了之前的思路的错误之处,如果长度为偶数并不能直接分为左右两个子字符串,因为可能存在"ababab"这种情况,在改正之后把偶数的解法和奇数的解法统一了一下,还是使用寻找约数的方式来减少测试的次数。
public boolean repeatedSubstringPattern(String s) {
int len=s.length();
for (int i=1;i<=len/2;i++){
//如果能够整除,说明是一个约数,进行尝试,假设这个子字符串长度为i
if (len%i==0){
//循环i次,比较每一个字符
for (int j=0;j<i;j++){
char c=s.charAt(j);
int num=0;
for (int x=1;x<len/i;x++){
//统计不相同的个数
if (s.charAt(x*i+j)!=c)
num++;
}
if (num>0)
break;
if (j==i-1&&num==0)
return true;
}
}
}
return false;
}