题目来源:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
大致题意:
给一个字符串,求出无重复字符的最长子串长度
思路
题目要求的子串需要是连续的,于是可以维护一个滑动窗口,窗口内的字符串没有重复字符
滑动窗口
- 从第二个字符开始遍历字符串,使用一个标记表示窗口左边界,右边界即为当前遍历位置,并使用哈希表存下窗口内的字符串
- 每次遍历到一个字符,先判断窗口中是否有该字符,若有该字符则取出左边界对应位置字符,然后左边界往右移。同时遍历过程中更新最大长度
代码:
public int lengthOfLongestSubstring(String s) {
if (s.length() == 0) {
return 0;
}
Set<Character> set = new HashSet<>();
int len = 1; // 标记窗口长度
int idx = 0; // 标记窗口左边界
int ans = 1;
set.add(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
char c = s.charAt(i);
// 若窗口中有当前字符
if (set.contains(c)) {
// 左边界右移,直至窗口中没有该字符
while (idx < i && !set.contains(c)) {
set.remove(s.charAt(idx++));
len--;
}
}
len++;
set.add(c);
ans = Math.max(ans, len);
}
return ans;
}