力扣:无重复最长子串(python)

题目:

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

思路:

以下各个字符表示的含义代码中有注释

例如 s 为“abcabcbb”,
首先 i 指向 a 处,列表 b 目前为空,因此目前没有重复,count +1,字符 ‘ a’ 加入b中,i++。直到 i 指向 s 串中第二个 a 处,此时列表 b=[a,b,c],b 中含有 “a”判断重复,此时count = 3,该子串无重复的长度为3,flag 记录此时的长度,和 max 比较,若大于max,则替换max的值。s 从 b 处截取,则 s 更新为 s=‘bcabcbb’,令 i=0,b 清空,count =0,重新从s的第一个字符‘b’处开始遍历。

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if s=='':    # 如果s为空,则无符合题目要求的子串,即长度为0
            return 0
        global max   # 记录目前为止最长的无重复字符子串的长度值max
        max = 0
        global flag   # 记录当前无重复字符子串的长度值flag
        flag = 0
        global count    # 子串长度计数
        count = 0    
        global b      # 使用列表b记录当前子串已遍历过的字符
        b=[]
        global i   # 当前遍历s串中的位置i
        i=0
        while i<len(s):    # s串未遍历结束时
            if b.count(s[i])==0:   
            # 如果当前s串位置i处的字符没有在b中出现过,则说明目前的子串仍是无重复的
                count+=1
                b.append(s[i])   # 把当前的S串位置i处的字符加入列表b中
                i+=1    # 继续查看s串中的下一个位置处的字符
                continue
            else:     # 如果当前s串位置i处的字符在b中出现过,则说明目前的子串是重复的
                flag=count    
                if flag>max:  # 如果目前的无重复子串比之前的长,则替换
                    max=flag
                count = 0    # 长度计数清零
                beg=s.index(s[i])   # 获得S串中重复字符的位置
                i=0   
                b.clear()   
                s=s[beg+1:len(s)]    # 下一次遍历从没有重复的字符处开始,丢弃s串中重复的部分
        if count>max:
            max=count
        return max

方法2:

使用滑动窗口的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值