使用左右指针方法解决最长无重复字符子串问题

问题分析

给定一个字符串 s,我们需要找出其中不含有重复字符的最长子串的长度。例如,对于字符串 “abcabcbb”,无重复字符的最长子串是 “abc”,其长度为 3。对于字符串 “bbbbb”,无重复字符的最长子串是 “b”,其长度为 1。

解决方案

为了解决这个问题,我们可以使用滑动窗口技术,结合左右指针的方法。这种方法的核心思想是维护一个字符集合,用来记录当前窗口中的字符。我们使用两个指针 left 和 right 来表示窗口的左右边界。当窗口中的字符不重复时,我们不断扩大窗口;一旦发现重复字符,我们就移动左指针,直到窗口中的字符不再重复。

实现步骤

1、初始化 left 指针为 0,char_set 为空集合,max_len 为 0。
2、遍历字符串 s,使用 right 指针指向当前字符。
3、如果 right 指向的字符在 char_set 中,说明窗口中有重复字符,我们需要移动 left 指针,直到 char_set 中不再包含 right 指向的字符。
4、将 right 指向的字符添加到 char_set 中。
5、更新 max_len 为当前窗口的长度,即 right - left + 1。
6、重复步骤 2-5,直到遍历完字符串 s。
7、返回 max_len。

代码示例

def lengthOfLongestSubstring(s):
    """
        使用左右指针的方法
    """
    left = 0
    char_set = set()
    max_len = 0

    for right in range(len(s)):
        while s[right] in char_set:
            char_set.discard(s[left])
            left += 1
        char_set.add(s[right])
        max_len = max(max_len, right - left + 1)
    return max_len

# 测试示例
print(lengthOfLongestSubstring('pwwkew'))  # 输出: 3

结论

通过使用左右指针方法,我们可以高效地解决最长无重复字符子串问题。这种方法的时间复杂度为 O(n),其中 n 是字符串的长度,因为我们只需要遍历字符串一次。希望本文能够帮助你更好地理解这个问题的解决思路,并在实际编程中应用这种方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大油头儿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值