无重复最长子字符串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路
听说这总方法叫 滑动窗口
依次递增地枚举子串的起始位置,那么子串的结束位置也是递增的!这里的原因在于,假设我们选择字符串中的第 k 个字符作为起始位置,并且得到了不包含重复字符的最长子串的结束位置为rkr_krk 。那么当我们选择第 k+1 个字符作为起始位置时,首先从 k+1 到 rkr_krk 的字符显然是不重复的,并且由于少了原本的第 k 个字符,我们可以尝试继续增大rkr_krk,直到右侧出现了重复字符为止。
用人话就是这样:
- 第一步: 创建一个
set用来存放不重复的字符串;maxLength为长度;两个指针,第一个指针j指向字符串的开头用于标记是第几个重复,第二个指针i跟着循环遍历字符串 - 第二步:判断set里面有没有s[i],如果没有说明目前还没有重复的字符串,可以把是s[i]添加到set里;并且比较maxLength和现在set的长度,大的赋值给maxLength
- 第三步:如果有s[i],说明有重复的了,则开始删除s[j],同时递增j
- 第四步:开始重复第二步第三步直到遍历完整个字符串为止。
var lengthOfLongestSubstring = function(s) { let i= 0,j=0,maxLength=0; let set = new Set(); if(s.length===0) return 0 for(i = 0;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 };
知识点
Math.max函数返回一组数中的最大值。

