1. 题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
示例 4:
输入: s = “”
输出: 0
示例5:
输入:s=“dvdf”
输出:3
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 题解
思路:滑动窗口+set数据结构完成,以每个字符为起始点找出该字符开始的最长不重复子串,最终返回多个不重复子串中的最长的那个,对于示例3 “pwwkew”,
以 (p)wwkew为起点最长不重复子串为(pw)wkew,
以 p(w)wkew为起点最长不重复子串为p(w)wkew,
以 pw(w)kew为起点最长不重复子串为pw(wke)w,
以 pww(k)ew为起点最长不重复子串为pww(kew),
以 pwwk(e)w为起点最长不重复子串为pwwk(ew),
以 pwwke(w)为起点最长不重复子串为pwwke(w)。
借助set结构存储不重复字符,使用滑动窗口,左指针指向子串的起使位置,左指针右移时从set中删除元素,右指针从左指针位置开始右移,右移的判断依据主要是set中不含有此字符。
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
const len = s.length;
if(len < 2){
return len;
}
let maxLen = 0;
let r = -1;
const set = new Set();
for(let i = 0; i < len; i++){
//左指针i右移,删除set中的上一元素
if(i != 0){
set.delete(s.charAt(i-1));
}
//右指针左移,元素加入set
while(r+1 < len && !set.has(s.charAt(r+1))){
set.add(s.charAt(r+1));
r++;
}
maxLen = Math.max(maxLen, r - i + 1);
}
return maxLen;
};
时间复杂度:O(n),
空间复杂度:O(n)。