https://leetcode.cn/problems/longest-substring-without-repeating-characters/
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
示例 2:
输入: s = “bbbbb”
输出: 1
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 时间复杂度O(N)
# 空间复杂度O(N)
# 难度:☆☆☆
# 标签:字符串,滑动窗口【不定宽】
# 本题最大特点就是滑动窗口宽度会变
left, right = 0, 0 # 定义窗口左端做引、右端索引
window = set() # 定义窗口,窗口为集合
ret = 0
while right < len(s): # 开始滑动窗口
# right先行,将字符一个个放入集合中,并记录长度
# 如果发现当前字符在集合中存在,开始移动left,直到该字符被清除集合
c = s[right]
while c in window:
window.remove(s[left])
left +=1
window.add(c)
ret = max(ret, right - left + 1)
right += 1
return ret
class Solution {
public int lengthOfLongestSubstring(String s) {
// 时间复杂度:O(N)
// 空间复杂度:O(Min(M,N))
// 难度:☆☆☆
// 标签:字符串,滑动窗口【不定宽】
int left = 0, right = 0, ret = 0;
HashSet<Character> window = new HashSet<>();
while (right < s.length()) {
char c = s.charAt(right);
while (window.contains(c)) {
window.remove(s.charAt(left));
left++;
}
window.add(c);
ret = Math.max(ret, right - left + 1);
right++;
}
return ret;
}
}