3. 无重复字符的最长子串
查看题目中等
哈希表
字符串
滑动窗口
双指针
频率: 1033
解法一:滑动窗口
时间复杂度:O(n) | 空间复杂度:O(min(m,n)) | 推荐使用
动画演示
准备就绪 - 点击开始按钮查看动画
代码实现
class Solution {
/**
* 滑动窗口解法
* 使用左右指针维护一个不包含重复字符的窗口
*/
public int lengthOfLongestSubstring(String s) {
// 使用HashMap记录字符最后出现的位置
Map<Character, Integer> charMap = new HashMap<>();
int left = 0;
int maxLength = 0;
for (int right = 0; right < s.length(); right++) {
char c = s.charAt(right);
// 如果字符已存在且在当前窗口内,移动左指针
if (charMap.containsKey(c) && charMap.get(c) >= left) {
left = charMap.get(c) + 1;
}
// 更新字符位置
charMap.put(c, right);
// 更新最大长度
maxLength = Math.max(maxLength, right - left + 1);
}
return maxLength;
}
}时间复杂度:O(n)
空间复杂度:O(min(m,n))
算法思路:
使用滑动窗口算法解决无重复字符的最长子串问题。
核心思想:
1. 使用左右指针维护一个不包含重复字符的窗口
2. 右指针扩展窗口,遇到重复字符时左指针收缩
3. 使用哈希表/Set记录窗口内字符的出现位置
4. 实时更新最大长度
复杂度分析:
- 时间复杂度:O(n),每个字符最多被访问两次(左指针和右指针各一次)
- 空间复杂度:O(min(m,n)),其中m是字符集的大小,n是字符串的长度