3.无重复字符的最长子串「力扣」

题目描述

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

示例 1:

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

示例 2:

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

示例 3:

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

解题

使用滑动窗口依次罗列出无重复子字符串集合,在判断最长的子串,以abcabcbb为例,类似如下;

abcabcbb 长度:1
^
abcabcbb 长度:2
^^
abcabcbb 长度:3
^ ^
abcabcbb 出现重复
^  ^
abcabcbb 长度:1
 ^ 
abcabcbb 长度:2
 ^^
abcabcbb 长度:3
 ^ ^
abcabcbb 出现重复
 ^  ^
abcabcbb 长度:1
  ^     
abcabcbb 长度:2
  ^^
abcabcbb 长度:2
  ^ ^
abcabcbb 出现重复
  ^  ^
...

不是最优解,但可以实现,源码如下:

/**
 * @param {string} 
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    let num = 0
    for (let i = 0, len = s.length; i < len; i++){
        for (let j = i + 1; j <= len; j++) {
            const str = s.slice(i, j)
            // 判断当前字符串中是否有重复字符,通过Set的特性转成数组直接去重
            if (str.length == [...new Set(str.split(''))].length) {
                num = Math.max(str.length, num)
            } else {
            // 当出现重复,窗口左侧右移
                i++
            }
        }
    }
    return num
};