// 思路
// 因为是无序字符 所以需要哈希表记录字符
// 用滑动窗口方法 以即将加入的下一个字符判断哈希表内是否出现重复
// 以此为条件 循环缩短窗口 直到窗口内哈希表不存在重复
// 再吸收字符 并判断结果值是否需要更新
function fn(source) {
let max = 0 // 找最大值初始值就为0
// 哈希表 记录滑动窗口内字符种类
let map = new Set() // 因为不需要计数 用set就够了
let start = 0 // 滑动窗口起始位置
for (let end = 0; end < source.length; end++) {
// 因为字符串不是按顺序排列 因此遇到重复的字符
// 滑动窗口缩短不止一次 因此要用循环直到窗口内没有重复字符
while (map.has(source[end])) {
// 即将加入的字符在map中重复 则移动起始位置 缩短窗口
// 因为要移动起始位置 因此原起始位置字符就要从map中移除
map.delete(source[start])
start++ // 移动起始位置
}
map.add(source[end]) // 将不重复的新字符添加到map
if (max < end - start + 1) {
// 当前窗口长度更长 更新max结果
max = end - start + 1
}
}
return max
}
// 验证
let str = "abcabcbb"
console.log('最长为' + fn(str)) // 3