思路
这题做法为滑动窗口(为什么用滑动窗口?如果暴力以每个字符开头开始暴力的话时间太久了,滑动窗口左边直接去掉的是完全没必要作为开头的所以利用滑动窗口一齐排除,省去了大部分的步骤),需要判断新加入窗口的右边有没有在这个出现过,如果没有出现过说明没有重复那就继续扩大窗口的右边,如果有重复的值,那就要注意一下了。这个无重复字符子串不可能再包括前面那个与它重复的字符了,因为是子串那么重复前面的也不能要了但是前面那个重复的后面那些字符串肯定和这个新出现的不相等还可以继续保留。
这里需要注意一下,出现重复的 前面的字符也需要在map表中删除掉,不删会影响后面的结果。
代码示例
func lengthOfLongestSubstring(s string) int {
if len(s)<=1{
return len(s)
}
result:=1
left:=0
m:=make(map[byte]int)
m[s[0]]=0
for i:=1;i<len(s);i++{
if pos,ok:=m[s[i]];ok{
if i-left>result{
result=i-left
}
for j:=left;j<pos;j++{
delete(m,s[j])
}
left=pos+1
}
m[s[i]]=i
}
if len(s)-left>result{
result=len(s)-left
}
return result
}