1、枚举
/** * @param {string} s * @return {boolean} */ var repeatedSubstringPattern = function(s) { //其实枚举即可呢。。。 if(s.lenght<2) return false; //每次枚举组成的滑动窗口都试一次即可 let len = 1; while(len<s.length){ let ok = true; //每次从len之后开始 for(let i=len;i<s.length;i++){ if(s[i]==s[i%len]){ continue; }else{ len++; ok = false; break; } } if(ok){ break; } } if(len<s.length&&s.length%len==0){ return true; }else{ return false; } };
2、小滑动窗口,其实也没有优化到什么
var repeatedSubstringPattern = function(s) { if(s.length<2) return false; let len = 1; for(let i=1;i<s.length;){ if(s[i]==s[i%len]){ i++; continue; }else{ //增长滑动窗口,并从滑动窗口后一个数字开始比较 len++; i=len; } } if(len<s.length&&s.length%len==0){ return true; }else{ return false; } };
大滑动窗口,解法很简单,但是只能通过114
var repeatedSubstringPattern = function(s) { //a //aba //abaab abaab //滑动窗口,从第一个开始增长 //如果当前元素结尾的词组并不能和字串对应了,滑动窗口就增长到该位置 //字串长度 let len = 1; //第一个肯定是,可以跳过了 for(let i=1;i<s.length;i++){ if(s[i]==s[i%len]){ continue; }else{ //此时字串就是[0,i] len=i+1; } } //滑动串口和字符串一样长,就是说这个字符串不能由字串重复生成 //重复生成的话,总长度/字串肯定是整数 if(len!=s.length&&s.length%len==0) return true; else return false; };
kmp太难!不管了,做出来就行。
做题一定要先考虑最简单的揭发,不要考虑什么滑动窗口,想了半天还不对