LeetCode459-重复的子串(枚举)

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太难!不管了,做出来就行。

做题一定要先考虑最简单的揭发,不要考虑什么滑动窗口,想了半天还不对

posted @ 2018-10-24 23:43  朋友圈  阅读(130)  评论(0编辑  收藏  举报