剑指offer48,leetcode第3题 最长不含重复字符的子字符串(双指针+dp思路(非正宗dp))

55 阅读1分钟

题意

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

思路

1、用max维护最长子串长度,然后结合双指针,将作边指针一步步往右移。 2、用map存储字符的情况。(map对象是按set的顺序来存储的,因此可以用来左指针的移动。)

var lengthOfLongestSubstring = function(s) {
    let n = s.length
    let max = 0
    let map = new Map()
    let len = 0
    for(let i = 0;i < n;i++){
        if(map.has(s[i])){
            for(let [key, value] of map){
                map.delete(key) 
                if(key!=s[i]) {
                   len--
                }
                else {
                    map.set(key, 1)
                    break
                }
            }
            max = Math.max(Object.keys(map).length, max) // Object.keys(map).length用来获取map的长度
        }else{
            map.set(s[i], 1)
            len++
            max = Math.max(len, max)
        }
        // console.log(map)
    }
    return max
};