leetcode-3.无重复字符的最长子串(易理解)

滑动窗口

要找到一个字符串中不含重复字符的最长子串的长度,可以使用滑动窗口技术。这种方法可以在 O(n) 时间复杂度内解决问题,其中 n 是字符串的长度。

滑动窗口算法

滑动窗口的基本思想是使用两个指针来表示一个窗口,这个窗口内的字符是当前不含重复字符的子串。我们通过调整窗口的边界来找到最长的子串。

实现步骤

  1. 初始化:使用两个指针 leftright,都初始化为 0。使用一个集合 charSet 来存储当前窗口内的字符。使用一个变量 maxLength 来记录最长子串的长度。

  2. 移动右指针:逐步增加右指针 right,将字符加入到 charSet 中。

  3. 检查重复:如果加入的字符导致重复,则移动左指针 left,并从 charSet 中移除字符,直到窗口内不再有重复字符为止。

  4. 更新最大长度:在每次调整窗口后,更新 maxLength 为当前窗口的长度(right - left + 1)和 maxLength 的较大值。

  5. 继续移动右指针,直到遍历完整个字符串。

示例代码

以下是使用 Python 实现的代码:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int ans = 0;
        int len = s.length();
        // corner case
        if (len <= 1) {
            return len;
        }
        // core
        int l = 0, r = 0;
        Set<Character> set = new HashSet<>();
        while (r < len) {
            if (!set.contains(s.charAt(r))) {
                set.add(s.charAt(r));
                ans = Math.max(r - l + 1, ans);
                r++;
            } else {
                set.remove(s.charAt(l));
                l++;
            }
        }
        return ans;
    }
}
def length_of_longest_substring(s: str) -> int:
    char_set = set()
    left = 0
    max_length = 0

    for right in range(len(s)):
        # 如果当前字符在set中,移动左指针,直到没有重复字符
        while s[right] in char_set:
            char_set.remove(s[left])
            left += 1
        # 将当前字符加入set
        char_set.add(s[right])
        # 更新最大长度
        max_length = max(max_length, right - left + 1)

    return max_length

# 示例
s = "abcabcbb"
print(length_of_longest_substring(s))  # 输出: 3

解释

  • 集合 charSet:用于存储当前窗口内的字符,保证没有重复。
  • 左指针 left:用于缩小窗口,当发现重复字符时,移除左边的字符直到没有重复。
  • 右指针 right:用于扩大窗口,遍历字符串。
  • 最大长度 maxLength:用于记录当前找到的最长无重复字符子串的长度。

这种方法的优点是只需遍历字符串一次,因此时间复杂度是 O(n),适合处理较长的字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

看个人简介有交流群(付费)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值