双指针与滑动窗口中等1 种解法
#3无重复字符的最长子串
返回字符串中不含重复字符的最长连续子串长度。
#字符串#哈希表#滑动窗口
解题主线
01
窗口内始终保持每个字符至多出现一次;右端加入重复字符后,左端持续收缩直到约束恢复。
02
字符最后出现位置可以让左边界一步跳过冲突位置,避免逐个递减频次。
解法 1:滑动窗口计数
右指针扩张并记录字符频次;当前字符重复时移动左指针并减少沿途频次。
时间复杂度
O(n)
空间复杂度
O(k),k 为窗口内不同 UTF-16 字符数
java
import java.util.HashMap;
import java.util.Map;
final class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> frequency = new HashMap<>();
int left = 0;
int answer = 0;
for (int right = 0; right < s.length(); right++) {
char added = s.charAt(right);
frequency.merge(added, 1, Integer::sum);
while (frequency.get(added) > 1) {
char removed = s.charAt(left++);
frequency.put(removed, frequency.get(removed) - 1);
}
answer = Math.max(answer, right - left + 1);
}
return answer;
}
}右指针扩张并记录字符频次;当前字符重复时移动左指针并减少沿途频次。
- 合并旧文件中重复的两个频次窗口实现。
边界与易错点
- 子串必须连续,不能按子序列处理。
- 旧文件两个方法完全等价,因此按同一滑动窗口解法去重。
- Java 的 char 表示 UTF-16 代码单元;若题意扩展到完整 Unicode 码点,应改用 codePoints。
整理来源
由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。
medium/Q003_LongestSubstring.java