LeetCode 03:无重复的最长子串

通过该题目学习了字典和元组的内容

题目如下: 

                                                        

代码如下:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        max_len=0 #max_len表示所有历史循环中的最大不重复长度
        if s is None or len(s)==0: #如果s是空或者s长度为0则直接返回max_len
            return max_len
        str_dict={}  #初始化一个字典,用来存放不重复的字母和字母【最新不重复】的下标数字
        one_max=0  #每次循环的最大不重复长度
        start=0  #不重复的开始位置
        
        for i in range(len(s)):  
            
            if s[i] in str_dict and str_dict[s[i]]>=start:#判断当前字符是否在字典中和当前字符的下标是否大于等于最近重复字符的所在位置
                
                start=str_dict[s[i]]+1 #更新不重复的开始位置,+1操作是因为刚开始是从0开始的,而不是1
            one_max=i-start+1  #更新单次不重复的最大长度
            str_dict[s[i]]=i   #更新字典,将s[i]表示的字母的对应下标数字i存入字典
            max_len=max(max_len,one_max) #比较此次循环的最大不重复子串长度和历史循环最大不重复子串长度
        
        return max_len

1、字典的具体数据如下,以"bbbbb"、"eeydgwdykpv"、"pwwkew" 、"abcabcbb"为例

字典中的信息表示每个字母以及该字母最新出现的位置

2、注意代码中str_dict[s[i]]表示的是一个数字,例如在s='eeydgwdykpv'中,s[i]是一个元组,s[0]='e',s[1]='e',s[2]='y',

str_dict["e"]表示字典str_dict中key为"e"所对应的value=1,所以str_dict[s[i]]是一个数字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值