思路
双指针维护一个窗口,
通过一个集合,维护当前窗口内出现的字符。
首先,左指针固定在开头,
然后,右指针向右移动,
如果右指针指向的字符,不在集合里,则将该字符添加进集合中,并且右指针向右移动。
直至右指针指向的字符,已经在集合当中了。
此时,记录下窗口的长度,然后左指针向右移动,每次移动都移除集合中当前指向的字符。直至右指针当前指向的字符也被移除。
Python版本
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
n = len(s)
if n <= 1:
return n
left,right = 0,1
res = 0
record = set()
record.add(s[left])
while right < n:
if s[right] in record:
record.remove(s[left])
left += 1
else:
record.add(s[right])
right += 1
res = max(res,right-left)
return res
Java版本
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
int left = 0;
int right = 0;
int res = 0;
if (n <= 1){
return n;
}
HashSet<Character> record = new HashSet<Character>();
while (right < n){
if (record.contains(s.charAt(right))){
record.remove(s.charAt(left));
left += 1;
}
else{
record.add(s.charAt(right));
right += 1;
}
res = Math.max(res,right-left);
}
return res;
}
}