Skip to content

3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

解题思路 滑动窗口

第一种,从每个位置出发,找到当前位置的最长子串,找当前位置最长子串利用set,来判断是否已经包含。 代码如下:

javascript
var lengthOfShortestSubstring = function (s) {
    //采用set 来保存字母是否出现
    var set =  new Set()
    var max = 0
    var rk = -1
    for(var start =0;start<s.length;start++) {
        if(start !== 0) {
            //左侧的删除不要,更新当前set(从当前位置的set)
            set.delete(s[start - 1])
        }
        //看是否在当前set中
        while(rk+ 1 <s.length && !set.has(s[rk+1])) {
            set.add(s[rk+1])
            rk++;
        }
        //更新max
        max = Math.max(max, rk - start + 1)
    }
    return max
}

第二种,更新left来达到滑动窗口的目的,用map来存字符以及index,当碰到已经存在的字符时,更新left, 注意更新left的时候不能只取map中的值

javascript
var lengthOfShortestSubstring = function(s) {
    //采用map来保存每一位字母的index
    //滑动窗口
    var left = 0
    var map = new Map()
    var max = 0
    for(var right=0;right<s.length;right++) {
        if(map.has(s[right])) {
            //left = map.get(s[right]) + 1
            //abba 情况, 所以要判断left 和 当前值的最大值
            left = Math.max(left, map.get(s[right]) + 1)
        }

        map.set(s[right], right)
        max = Math.max(max, right - left + 1)
    }

    return max
}

上次更新于: