003-无重复字符的最长子串
原题:无重复字符的最长子串
思路:用哈希表记录每个出现过的字符串的下标,滑动窗口表示当前子串
思路
遍历每个字符
如果哈希表中已有该字符串,且在窗口范围中
hashMap.has(char) && hashMap.get(char) >= left
,更新滑动窗口起点如果没有该字符串,则计算当前下标(即窗口的终点)到起点
left
的长度,与最大值max
比较,保留较大的值每次循环的最后记录当前字符的下标
hashMap.set(char, right)
1. 初始化
1 | // 哈希表 |
开始遍历,滑动窗口起点 **left = -1
(重点)**,计算长度时公式为 right - left
,不算入 left
上的字符
此时若计算下标 right = 0
的子串长度,结果为 left - right
即 0 - (-1) = 1
1 | for (let right = 0, left = -1; right < s.length; right++) { |
2. 检查哈希表
如果 left
到当前下标之间有重复字符,设置滑动窗口为重复字符的下标
1 | // 如果 left 到当前下标之间有重复字符 |
3. 更新最大值
如果没有重复字符,更新最大值,值为 right - left
,不包括 left 上的字符
1 | // 如果没有重复才更新最大值,长度为 left 到 i,不包括 left 上的字符 |
4. 记录当前字符下标
1 | hashMap.set(char, right); |
完整代码
1 | /** |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 乱炖锅!
评论