leetcode第3题python版无重复字符的最长子串

'''
3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
审题:
a、子串是连续的,区别于子序列
b、无重复字符
'''
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        # 1. 定义返回的字符串最大长度
        max_len = 0
        # 2. 初始化慢指针
        low = 0
        # 3. 初始化字典,用于存储上次出现的字符及索引,须及时更新重复字符索引
        last_occurence = {}
        # 4. 遍历字符串中的字符和索引
        # for idx, single_char in enumerate(str):
        for idx, single_char in enumerate(s):
            # 5. 重复出现的判断 易错点:python中的逻辑与、按位与其他语言的区别
            # last_occurence[single_char] >= low可以排除掉low之前和single_char相同的情况,
            # 这种情况之前计算过
            if single_char in last_occurence and last_occurence[single_char] >= low:
                # 6. 更新慢指针(左指针)
                low = last_occurence[single_char] + 1
                # 7. 更新子串最大长度 遇到重复字符才更新一次 这里更新会有问题,
                # 如果一直没有重复的,就无法返回最大长度
                # max_len = max(max_len, idx - low)
                # 8. 更新上次重复字符出现的索引
                last_occurence[single_char] = idx
            else:
                last_occurence[single_char] = idx
                # 这里返回最大长度,虽然有重复计算,但准确
                max_len = max(max_len, idx - low + 1)

        return max_len
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ICPunk

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

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

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

打赏作者

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

抵扣说明:

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

余额充值