leetCode Day2 无重复字符的最长子串

116 阅读1分钟

无重复字符的最长子串

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

输入: s = "pwwkew"
输出: 3

方法一:暴力解法Set

function lengthOfLongestSubstring(s) {
    let count = 0
    for(let i=0; i<s.length; i++){
        let set = new Set()
        let max = 0
        let j = i
        while(j<s.length && !set.has(s[j])){
            set.add(s[j]);
            max++;
            j++
        }
        console.info(count)
        count = Math.max(count, max)
    }
    return count;
}
lengthOfLongestSubstring('pwwkew')

方法二:滑动窗口

  • 解题思路
  • 循环去掉左边第一个元素,直到窗口中元素无重复,此时再扩大窗口。主要就是进行扩张与收缩,右指针扩张到滑动窗口不满足条件的时候暂停,左指针开始收缩窗口,让窗口满足条件后右指针再进行扩张。
function lengthOfLongestSubstring(s){
    let count = 0;
    let set = new Set();
    let left = 0;
    let right = 0;
    while(left<s.length){
        while(right<s.length && !set.has(s[right])){
            set.add(s[right]);
            right++;
        }
        count = Math.max(count, right - left);
        set.delete(s[left]);
        left++;
    }
    return count;
}
lengthOfLongestSubstring('pwwkew')

滑动窗口解法2:

var lengthOfLongestSubstring = function(s) {
    let set = new Set()
    let i=0, j=0, maxLength = 0;
    if(s.length === 0) {
        return 0
    }
    for(i; i < s.length; i++){
        if(!set.has(s[i])){
            set.add(s[i])
            maxLength = Math.max(maxLength, set.size)
        } else{
            while(set.has(s[i])){
                set.delete(s[j])
                j++
            }
            set.add(s[i])
        }
    }
    return maxLength
}