题目描述:
难度:Middle
相关话题:哈希表
、双指针
、字符串
、Sliding Window
给定一个字符串,请你找出其中不含有重复字符的最长子串 的长度。
示例1:
输入:"abcabcbb"
输出:3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入:"bbbbb"
输出:1
解释:因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入:"pwwkew"
输出:3
解释:因为无重复字符的最长子串是"wke",所以其长度为 3。
请注意,你的答案必须是 子串的长度,"pwke"是一个子序列,不是子串。
思路:
定义一个startIdx
,表示当前从哪个索引开始检查,遍历s
,并且通过map
保存当前检查的字母,
如果当前字母在map
中存在,并且它对应的索引在startIdx
之后,说明这个字母在当前的检查范围内重复了,需要更新startIdx
;
如果这个字母对应的索引在startIdx
之前,说明虽然重复,但不在当前检查范围内,因此不需任何操作。
/**
* @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
* @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
if(s==='')return 0
let map=new Map()
let startIdx=0
let max=0
for(let i=0;i<s.length;i++){
let cur=s[i]
if(map.has(cur) && map.get(cur)>=startIdx){
startIdx=map.get(cur)+1
}
map.set(cur,i)
max=Math.max(max,i-startIdx+1)
}
return max
};
扩展阅读: