问题描述:如“abcabc”是由“abc”重复两次组成
代码如下
由于时间问题来不及解释太多,若有疑问可留言,欢迎斧正。
// 判断一个字符串是否由一个子字符串重复多次组成
//如果字符串长度为偶数,则分成两份后一定是重复的,以此类推,最多除以len/2次
//为了保证效率,不可能挨个数地除,因此,可以先找出小于len/2的质数,除以质数就好。
/*判断是否为质数*/
function isPrime(a) {
if (a == 2) {
return true;
}
for (i = 2; i <= Math.sqrt(a) + 1; i++) {
if (a % i == 0) {
return false;
}
}
return true;
}
isPrime(9);
function isStringRepeat(str) {
var len = str.length;
var result = false;
var temp = [];
var primeNum = [];
var count = 0;
for (let n = 2; n < len / 2 + 1; n++) {
if (isPrime(n)) {
primeNum.push(n);
}
}
console.log('质数集合为' + primeNum);
back1:for (let k = 0; k < primeNum.length; k++) {
var yuShu = len % primeNum[k];
var subStrLen = len / primeNum[k]
if (yuShu == 0) { //这里,不判断不等于0的情况,如果都!=0的话则原来的值不变。
++count; //次数用该变量来记录进入此循环(即能够被整除)的次数
for (let i = 0; i < subStrLen;i++) { //i<子串的长度
for (let j = 1; j < primeNum[k]; j++) {
if (str.charAt(i) != str.charAt(subStrLen * j + i)) {
temp.push('false'); //这里利用了一票否决(为了保证循环完,此处不能轻易赋result的值)所以先建立一个数组保存其结果
}; continue back1;
};
}
}
}
for(let i=0;i<temp.length;i++){
if(temp.length==count){ //错一次就会记录一个'false',,
result = false;
}else{
result = true;
}
}
console.log('输入的字符串是'+str);
console.log("字符串由一个子字符串重复组成?" + result);
}
var str1 = "abcabcabcabcabcabc33abcabcabcabcabcabcabcabc33abcabc";
isStringRepeat(str1);