思路1: 遍历+hash表 复杂度O(n2)
固定一个数字,遍历后面的数字,用 hash表判断这个区间是否有重复的元素
// 思路1: 遍历+hash表 复杂度O(n2)
//固定一个数字,遍历后面的数字,使用hash表判断是否存在重复的数字
func lengthOfLongestSubstring(s string) int {
//参数判断
if len(s) < 2 {
return len(s)
}
max := 0
for i:=0;i<len(s);i++{
//map字符和字符出现的下标
m := make(map[byte]struct{})
m[s[i]] = struct{}{}
//左边下标是i的最大长度
tempMax := 1
for j:=i+1;j<len(s);j++{
//如果包含就break
if _,ok := m[s[j]];ok{
break
}
//如果不包含就tempMax++并set
tempMax++
m[s[j]] = struct{}{}
}
//刷新最大长度
if tempMax > max{
max = tempMax
}
}
return max
}
思路2: 滑动窗口+hash表
//思路2:滑动窗口+hash表,复杂度O(n)
//left,和right位滑动窗口,m[byte]int 记录的是最新的 byte 出现的下标
//m如果存在并且下标再窗口内部就缩小窗口
//m如果不存在就增加窗口
func lengthOfLongestSubstring(s string) int {
//参数处理
if len(s) < 2 {
return len(s)
}
//滑动窗口的左边界
left := 0
//最新的字母和index下标
m := make(map[byte]int,len(s))
max := 0
for right := 0;right < len(s);right++ {
i,ok := m[s[right]]
//如果存在并且再窗口内部就缩小窗口
if ok && i >= left{
left=i+1
}
//如果不存在就增加窗口
m[s[right]] = right
tempMax := right - left +1
if tempMax > max {
max = tempMax
}
}
return max
}