无重复字符的最长子串(python版)详细解答

本题归属于滑动窗口类,按照固定框架解决问题

先附上代码:

class Solution:

    def lengthOfLongestSubstring(self, s: str) -> int:

        max_len = 0

        hashmap = {}

        start = 0

        for end in range(len(s)):

            hashmap[s[end]] = hashmap.get(s[end],0) + 1

            if end - start + 1 == len(hashmap):

                max_len = max(max_len, end - start + 1)

            while end - start + 1 > len(hashmap):

                hashmap[s[start]] -= 1

                if hashmap[s[start]] == 0:

                    del hashmap[s[start]]

                start += 1

        return max_len


代码详细介绍部分: 

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
      1.首先把要求的结果表示出来,所以定义了 max_len;因为这里说了是无重复的子串,在python中的数据结构常见的有集合和字典,集合只是一群不重复的元素,而字典有一一映射关系,即键值对。对于此类题目都是采用哈希表,所以定义变量hashmap={}.
        max_len, hashmap = {}

 2.滑动窗口类还需要两个变量来表示窗口的范围,因此定义了start = 0,表示窗口的最左的位置,最右的位置因为一直在向右移,所以使用循环结构定义end,而不是单独定义一个如start的变量。
        start = 0
        for end in range(len(s)):


            hashmap[s[end]] = hashmap.get(s[end], 0) + 1  

代码解读:Python 字典 get() 函数返回指定键的值,如果值不在字典中返回设定好的默认值。实操如下:

        定义一个字典dict,语法:dict.get(key,default=None),其中key为键值类似于索引,如果默认返回值为0,只需要写成dict.get(key)。

        所以hashmap[s[end]] = hashmap.get(s[end], 0) + 1  这条语句翻译成,如果哈希表中有这个key,那么它出现的次数就在原有基础加1,没有这个key,就是第一次出现,次数刚好为1。


            if len(hashmap) == end - start + 1:

代码解读:字典中的len()是查询有多少对键值对,所以 if len(hashmap) == end - start + 1这句话翻译成当哈西表中的键值对数目等于所经过的路径时,即表明目前还没碰到重复的元素。


                max_len = max(max_len, end - start + 1)
代码解读:这句话作用是更新当前的最大长度。如何起作用,就是将这段没有重复元素的路径的长度与之前获得的最大长度作比较,即可更新最大长度。      


        
            while end - start + 1 > len(hashmap):

代码解读:end - start + 1 > len(hashmap),表示当前碰到重复元素了,因为字典中没有重复的元素,所以碰到重复的元素也不会增加键值对数目。


                head = s[start]

代码解读:很好理解,增加程序的可读性。每个hashmap()括号中都可以用直接用s[start]


                hashmap[head] -= 1
                if hashmap[head] == 0:
                    del hashmap[head]
                start += 1
   

代码解读:因为碰到重复元素了,所以需要计算新的子串长度,新的子串不能有重复的元素,所以新的子串起点应该是重复出现的元素第一次出现的后一位元素,需要将start右移到后一位元素所在位置,操作是 start += 1,那么应该如何保证移到这个位置?

    我们对以上进行总结,我们想要的就是没有重复元素的字段,不就是满足

end - start + 1= len(hashmap),end-start+1知道是新的子串的长度,我们要让它与新的哈希表的键值对数目进行比较,所以我们需要删除重复出现的元素第一次出现的前面所有的元素,以得到新的哈希表的键值对数目,注意:不要删除重复的元素,因为第二次出现的元素并没有增加键值对数目,所以操作是

                                hashmap[head] -= 1

                                if hashmap[head] == 0:
                                    del hashmap[head]

最后不要忘记返回max_len。

return max_len

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值