问题描述
LeetCode 3. 无重复字符的最长子串 (opens in a new tab),难度中等。
给定一个字符串 s
,请你找出其中不含有重复字符的最长子串的长度。
示例 1
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
题解
Solution.java
public int lengthOfLongestSubstring(String s) {
char[] chars = s.toCharArray();
Set<Character> set = new HashSet<>();
int left = 0;
int ans = 0;
for (int i = 0; i < chars.length; ++i) {
if (!set.contains(chars[i])) {
set.add(chars[i]);
ans = Math.max(ans, i - left + 1);
} else {
// 左指针右移 chars[left] == chars[i],并在 set 删除 chars[left]
while (chars[i] != chars[left]) {
set.remove(chars[left++]);
}
// 当前 chars[left] == chars[i],left + 1 == i,left 需要右移一位
left++;
}
}
return ans;
}