3 无重复字符的最长子串
2025年5月27日大约 1 分钟
🚀 相关链接
📜 描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串的长度。
💡 示例
示例 1
- 输入:
s = "abcabcbb" - 输出:
3 - 解释: 因为无重复字符的最长子串是
"abc",所以其长度为3。
示例 2
- 输入:
s = "bbbbb" - 输出:
1 - 解释: 因为无重复字符的最长子串是
"b",所以其长度为1。
示例 3
输入:
s = "pwwkew"输出:
3解释: 因为无重复字符的最长子串是
"wke",所以其长度为3。请注意,你的答案必须是 子串 的长度,
"pwke"是一个子序列,不是子串。
📝 提示
0 <= s.length <= 5 * 10^4s由英文字母、数字、符号和空格组成
💭 思路
使用 滑动窗口 的思想来解决这个问题:
- 维护一个窗口,窗口的左边界和右边界分别用
l和r表示。 - 使用一个列表
list来存储当前窗口中的字符。 - 遍历字符串
s,如果当前字符s[r]不在list中,则将其加入list并扩展右边界r。 - 如果当前字符
s[r]已经在list中,则移除list中的第一个字符并收缩左边界l。 - 在每次扩展或收缩窗口时,记录窗口的最大长度。
💻 代码实现
public int lengthOfLongestSubstring(String s) {
List<Character> list = new ArrayList<>();
int l = 0, r = 0, ans = 0;
while (l <= r && r < s.length()) {
if (l == r) {
list.add(s.charAt(l));
ans = Math.max(ans, list.size());
r++;
} else {
Character c = s.charAt(r);
if (list.contains(c)) {
list.removeFirst();
l++;
} else {
list.add(s.charAt(r));
ans = Math.max(ans, list.size());
r++;
}
}
}
return ans;
}