LeetCode HOT 100题目解析——滑动窗口:无重复字符的最长子串(Java详细讲解)
一、题目介绍
本次随机解析的是力扣HOT 100中的经典题目:3. 无重复字符的最长子串
题目描述:
给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
示例:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
二、解题思路讲解
本题考察的核心算法是“滑动窗口”,用于寻找连续区间(子串)内的最优解。
滑动窗口思路:
- 定义窗口左右边界,即2个指针left和right。
- 用一个HashSet(集合)来存储当前窗口内的字符,保证无重复。
- 右指针right不断右移,每次遇到未出现过的字符就加入集合。
- 一旦遇到重复字符,就将左指针left右移,直到删除重复字符。
- 每次窗口合法时,更新最大长度。
这种方法只需遍历一次字符串,时间复杂度为O(n)。
三、Java代码实现(含详细注释)
import java.util.HashSet;
import java.util.Set;
public class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> set = new HashSet<>(); // 存储窗口内的字符
int maxLen = 0; // 记录最长长度
int left = 0; // 左指针
for (int right = 0; right < s.length(); right++) {
char c = s.charAt(right);
// 如果出现重复字符,移动左指针,直到窗口内无重复
while (set.contains(c)) {
set.remove(s.charAt(left));
left++;
}
set.add(c); // 加入当前字符
maxLen = Math.max(maxLen, right - left + 1); // 更新最大长度
}
return maxLen;
}
}
代码说明:
- 用HashSet来检查窗口内是否有重复字符。
- 右指针遍历字符串,遇到重复,移动左指针并移除对应字符,直到无重复。
- 每次都取当前窗口长度的最大值。
- 整体时间复杂度O(n),空间复杂度O(min(n, m))(n为字符串长度,m为字符集大小)。
四、小结
本题是滑动窗口的经典应用,适合所有算法初学者。掌握此题后可以举一反三,解决一系列窗口相关问题。
希望本讲解能帮助你理解“滑动窗口”技术,欢迎继续关注LeetCode HOT 100题目解析!