美文网首页
LeeCode 3. Longest Substring Wit

LeeCode 3. Longest Substring Wit

作者: scoyzhao | 来源:发表于2018-03-07 21:34 被阅读0次
image.png

题目的意思是找出给出字符串的不重复字串的最大值。最开始,我的想法是,用ES6里的Set结构,因为它可以去掉数组中的重复项,然后,如果去掉后的数组和原来的数组长度不同,那么说明有了重复项。

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
    var length = 0
    var max = 0
    var lost // 剩余长度
    if (s == '') {
        return 0
    } else {
        var aStr = s.split('') // 把字符串换成数组,方便比较
        for (let i = 0; i <= aStr.length; i++) {
            lost = aStr.length - i
            if (lost < max) {
                return max
                break
            }
            for (let j = i + 1; j <= aStr.length; j++) {
                // 原始长度
                let l1 = aStr.slice(i, j).length
                // 去掉重复值以后的长度,这里set的长度用size
                let l2 = (new Set(aStr.slice(i, j))).size
                if (l1 == l2) {
                    length = j - i
                    if (length > max) {
                        max = length
                    }
                    continue
                } else {
                    break
                }
            }
        }
    }
};

这里遇到的问题是,针对非常非常的长的字符串,会超时。。。。。


参考了一个答案,用的方法是滑动窗口算法,就是说,确保窗口里没重复的,往后走,有重复的移动左边的,没问题移动右边的。

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    var max = 0, l = 0, r, i
    if(s.length < 2) return s.length
    
    for(r = 1; r < s.length; r++) {
        // 大于0说明有重复的,r-1的意思是从r-1到0位,检查是否有和最右边的有重复的。如果有,i》0
        i = s.lastIndexOf(s[r], r - 1)
        if(i >= 0) {
            max = Math.max(max, r - l)
            // 移动左边到应该到的位置
            l = Math.max(l, i + 1)
        }
    }
    return Math.max(r - l, max)
};

相关文章

网友评论

      本文标题:LeeCode 3. Longest Substring Wit

      本文链接:https://www.haomeiwen.com/subject/nlysfftx.html