3. Longest Substring Without Repeating Characters
此题的关键在于结合 Map结构维护一个表结构实时记录重复字母的位置信息
解题思路
- 如果长度为 0 直接返回
- 假设最长字串长度 max = 0, 每次计算未重复字串开始的位置 start, 记录重复字母出现的位置 map
- 首先判断字母是否重复,如果重复需要更新 start 信息指向重复字母的下一个位置
- 更新 Map结构实时维护重复char的信息
- 计算此时未重复字符串长度 与 假设最长度 max,取较大值覆盖 max,
代码
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
if (s.length === 0) return s
let max = 0
let start = 0
let map = new Map()
for (let i =0; i < s.length; i++) {
const char = s[i]
const isRepeat = () => map.has(char)
// 记录当 i 指针指向了重复字母时,start 需要更新到上一次这个字母出现时的下一个位置
const updateStart = () => {
// 'abba' 当遍历到第二个 b 时
// map表是这样的 {a: 0, b: 1} start = 0,
// 这时计算所得即 start = 2
// 当遍历到第二个 a 时 {a: 0, b: 1} start = 2 , start = Math.max(2, 1),
// 这时需要防止 start 指针重复回到 1 位置,所以需要计算两者较大的值
start = Math.max(start, map.get(char) + 1)
}
if (isRepeat()) {
updateStart()
}
// 每次循环都需要更新字母的位置信息
map.set(char, i)
// 由于需要计算 length 所以类似 0 - 0 需要加 1
max = Math.max(max, i - start + 1)
}
return max
};