其他分享
首页 > 其他分享> > 003——无重复字符的最长子串

003——无重复字符的最长子串

作者:互联网

003——无重复字符的最长子串

1.题目

在这里插入图片描述

2.我的解决办法

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        ls = []     # 定义空列表作为滑动窗口
        max_len = 0 # 最大长度
        count = 0   # 滚动统计数
        if len(s) == 1: # 当字符串长度为1
            return 1
        for i in range(len(s)): # 当字符串长度大于1
            if max_len <count:  # 内循环终止的情况2:没有碰到重复且遍历到字符串末尾,这时需要进行比较
                max_len = count
            ls.clear()  # 当i指针更换时,列表清零,重新计数
            count = 0
            ls.append(s[i])
            count += 1
            for j in range(i+1, len(s)):
                if s[j] in ls:  # 内循环终止的情况2:碰到重复,这是需要进行比较
                    if(max_len < count):
                        max_len = count
                    count = 0
                    break
                ls.append(s[j])
                count += 1
        return max_len

3.官方的解决办法

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        # 哈希集合,记录每个字符是否出现过
        occ = set()
        n = len(s)
        # 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
        rk, ans = -1, 0
        for i in range(n):
            if i != 0:
                # 左指针向右移动一格,移除一个字符
                occ.remove(s[i - 1])
            while rk + 1 < n and s[rk + 1] not in occ:
                # 不断地移动右指针
                occ.add(s[rk + 1])
                rk += 1
            # 第 i 到 rk 个字符是一个极长的无重复字符子串
            ans = max(ans, rk - i + 1)
        return ans

标签:子串,字符,窗口,occ,len,003,ans,指针,rk
来源: https://blog.csdn.net/TommyLiuZ/article/details/114386875