题目描述
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
思路题解
用一个指针i
代表窗口的左边,指针j
代表窗口右边。i<n
时循环,hashmap isRepeat[byte]int
判断是否含有重复字符:
- 若
j+1<n && isRepeat[s[j+1]]==0
,则代表无重复且j
不为最后一个元素,则j++
,求出现在的ans=j-i+1
和原来的ans
的最大值赋值给新的ans
:ans=max(ans,j-i+1)
。并在hashmap里面加入s[j]
,表示s[j]
已经被添加过了。 - 1步骤一直循环,直到不满足条件,即:
j
为最后一个或者s[j]
已经遍历过了 - 然后删除左边已经添加过的
s[i]
(因为每次此时i~j内部一定是无重复的,遂删除最左边的i,看看j+1是否和[i+1,j]重复,若无重复,则新的序列为[i+1,j+1],且长度和之前一样),再进行第1-2步。
代码如下
func lengthOfLongestSubstring(s string) int {
if s==""{return 0}
i,j:=0,0
ans:=1
n:=len(s)
isRepeat:=make(map[byte]int)
isRepeat[s[0]]=1
for i<n{
for j+1<n && isRepeat[s[j+1]]==0{
j++
ans=max(ans,j-i+1)
isRepeat[s[j]]=1
}
delete(isRepeat, s[i])
i++
}
return ans
}
func max(i,j int) int {
if i>j{
return i
}else{
return j
}
}