LeetCode HOT 100题目解析——滑动窗口:无重复字符的最长子串(Java详细讲解)

LeetCode HOT 100题目解析——滑动窗口:无重复字符的最长子串(Java详细讲解)

一、题目介绍

本次随机解析的是力扣HOT 100中的经典题目:3. 无重复字符的最长子串

题目描述:

给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。

示例:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

二、解题思路讲解

本题考察的核心算法是“滑动窗口”,用于寻找连续区间(子串)内的最优解。

滑动窗口思路:

  1. 定义窗口左右边界,即2个指针left和right。
  2. 用一个HashSet(集合)来存储当前窗口内的字符,保证无重复。
  3. 右指针right不断右移,每次遇到未出现过的字符就加入集合。
  4. 一旦遇到重复字符,就将左指针left右移,直到删除重复字符。
  5. 每次窗口合法时,更新最大长度。

这种方法只需遍历一次字符串,时间复杂度为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题目解析!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值