方法1
// 方法1
// 滑动窗口方法。利用两个指针组成滑动窗口,保证每次窗口都不包含重复元素。
// 记录每个窗口的长度,返回最大的窗口长度,也就是最长不重复子串。
func lengthOfLongestSubstring(s string) int {
// 定义左指针,右指针,滑动窗口最大长度
var left = 0
var right = 0
var windowMaxLength = 0
// 创建字典,用于存放已经遍历过的字符,用以辅助判断新的字符是否重复
var mapChar = map[byte]int{} // 字符:索引
// 左指针不断往后移动
for right < len(s) {
// 判断是否重复,如果重复,左指针往前移动
var index = s[right]
v, ok := mapChar[index]
if ok && v >= left {
left = v + 1
}
// 计算滑动窗口的长度,并与原来的滑动窗口长度比较,取最大滑动窗口长度
var windowNewLength = right - left + 1
if windowNewLength > windowMaxLength {
windowMaxLength = windowNewLength
}
// 将当前字符添加到字典中
mapChar[index] = right
right++
}
// 返回滑动窗口最大长度
return windowMaxLength
}