3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
解题思路 滑动窗口
第一种,从每个位置出发,找到当前位置的最长子串,找当前位置最长子串利用set,来判断是否已经包含。 代码如下:
javascript
var lengthOfShortestSubstring = function (s) {
//采用set 来保存字母是否出现
var set = new Set()
var max = 0
var rk = -1
for(var start =0;start<s.length;start++) {
if(start !== 0) {
//左侧的删除不要,更新当前set(从当前位置的set)
set.delete(s[start - 1])
}
//看是否在当前set中
while(rk+ 1 <s.length && !set.has(s[rk+1])) {
set.add(s[rk+1])
rk++;
}
//更新max
max = Math.max(max, rk - start + 1)
}
return max
}
第二种,更新left来达到滑动窗口的目的,用map来存字符以及index,当碰到已经存在的字符时,更新left, 注意更新left的时候不能只取map中的值
javascript
var lengthOfShortestSubstring = function(s) {
//采用map来保存每一位字母的index
//滑动窗口
var left = 0
var map = new Map()
var max = 0
for(var right=0;right<s.length;right++) {
if(map.has(s[right])) {
//left = map.get(s[right]) + 1
//abba 情况, 所以要判断left 和 当前值的最大值
left = Math.max(left, map.get(s[right]) + 1)
}
map.set(s[right], right)
max = Math.max(max, right - left + 1)
}
return max
}