给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
这需要用到一个新的变量 freqMap
,用来记录窗口中的字母出现的频率数。在此基础上,先尝试取窗口的右边界再右边一个位置的值,也就是 str[right + 1]
,然后拿这个值去 freqMap
中查找:
- 这个值没有出现过,那就直接把
right ++
,扩大窗口右边界。 - 如果这个值出现过,那么把
left=right+1
,缩进左边界(让左边界直接为重复的字符),并且清空freqMap
。
循环条件是 left < str.length
,允许左边界一直滑动到字符串的右界。
test(){
let str="abcavc"
let left = 0
let right = -1
let freqMap = {} // 记录当前子串中下标对应的出现频率
let max = 0 // 找到的满足条件子串的最长长度
let res=""
while (left < n) {
let nt = str[right + 1]//取出每个字符
if (!freqMap[nt] && nt !== undefined) {
freqMap[nt] = 1
right++
res=res+nt
} else {
console.log(res)
res=""
freqMap={}//遇到重复字符清空频率数组
left=right+1 //直接从重复的字符开始找
}
max = Math.max(max, right - left + 1)
}
return max
}