LeetCode 第3题:无重复字符的最长子串

本文详细讲解了LeetCode第3题——无重复字符的最长子串的解题思路,重点介绍了使用滑动窗口法解决此问题,包括详细步骤和Java代码实现。通过滑动窗口,可以高效地找到最长无重复字符子串,时间复杂度为O(n)。
摘要由CSDN通过智能技术生成

LeetCode 第3题:无重复字符的最长子串

引言

大家好!今天我们要聊的这道题目在LeetCode上可以说是经典中的经典,它就像是编程世界中的“小李飞刀”,每次出手都能让新手和老手们汗颜。这道题目就是——LeetCode 第3题:“无重复字符的最长子串”。

这道题目听起来简单,实则有点考验我们的耐心和技巧。题目描述如下:给定一个字符串 s,请你找出其中不含有重复字符的最长子串的长度。

示例:

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

思路解析

朴素的暴力解法

最简单直接的办法就是暴力破解,遍历所有可能的子串,然后检查每个子串是否有重复字符。这种方法就像是用筛子筛沙子,效率很低。暴力解法的时间复杂度是 O(n^3),实在是不适合长字符串。

滑动窗口法

要高效地解决这个问题,我们需要用到滑动窗口法。这种方法就像是我们在拥挤的地铁里找座位,一直在前进的过程中找出最长的“独享座位”。

滑动窗口的核心思想是:

  1. 用两个指针表示窗口的起点和终点。
  2. 逐步移动终点指针,扩展窗口。
  3. 当发现重复字符时,移动起点指针,缩小窗口,直到窗口内没有重复字符。
  4. 记录窗口的最大长度。

详细步骤

  1. 创建一个哈希集合(HashSet)来保存当前窗口内的字符。
  2. 初始化两个指针 leftright,都指向字符串的起点。
  3. 移动右指针 right,如果字符不在集合中,就把字符加入集合并更新最大长度。
  4. 如果字符在集合中,就移动左指针 left,直到字符不再重复。
  5. 重复上述步骤直到右指针遍历完整个字符串。

代码实现

用Java来实现这个算法非常简单。代码如下:

import java.util.HashSet;
import java.util.Set;

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        Set<Character> set = new HashSet<>();
        int left = 0, right = 0, maxLength = 0;
        while (right < s.length()) {
            if (!set.contains(s.charAt(right))) {
                set.add(s.charAt(right));
                right++;
                maxLength = Math.max(maxLength, right - left);
            } else {
                set.remove(s.charAt(left));
                left++;
            }
        }
        return maxLength;
    }
}

图解

为了让大家更直观地理解滑动窗口法,我们用Mermaid语法来画图展示一下算法的过程。

假设我们有一个字符串 s = "abcabcbb"

初始状态
left = 0, right = 0, set = {}
第一个字符 'a'
set = {'a'}, maxLength = 1
第二个字符 'b'
set = {'a', 'b'}, maxLength = 2
第三个字符 'c'
set = {'a', 'b', 'c'}, maxLength = 3
第四个字符 'a'
set = {'b', 'c'}, left = 1
第五个字符 'b'
set = {'c', 'b'}, left = 2
第六个字符 'c'
set = {'b', 'c'}, left = 3
第七个字符 'b'
set = {'c', 'b'}, left = 4
第八个字符 'b'
set = {'c', 'b'}, left = 5
结束,maxLength = 3

通过这种方法,我们最终可以得到最长无重复字符子串的长度。

总结

好了,今天我们详细讲解了LeetCode第3题“无重复字符的最长子串”的解题思路和实现。滑动窗口法是一种非常高效的解决方案,时间复杂度为 O(n),适用于大部分实际场景。

最后提醒大家,不管是写代码还是挤地铁,找到最佳位置和路径都是一门学问。希望大家能在编码的旅途中找到属于自己的最佳“座位”。

如果本文对您有所帮助的话,请收藏文章、关注作者、订阅专栏,感激不尽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gemini技术窝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值