用python编写一个无重复子串

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

示例 1:

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

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3

请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

这道题需要借助哈希查找key的O(n) 时间复杂度, 否则就会超时

初始化一个 哈希表\字典 dic

头指针start 初始为0

当前指针 cur 初始为0

最大长度变量 l 初始为0

用cur变量从给定字符串str的开头开始 一位一位的向右查看字符,直到整个字符串遍历完, 对每一位字符进行如下:

当前位置的字符为 c = str[cur]

查询当前字符 c 是否 在哈希表dic的键 当中,表示 当前字符c 是否之前遍历到过

如果 当前字符还没出现过,就 在dic中记录一个键值对 (当前字符c,当前位置cur )

cur 后移一位

如果 当前字符出现过, 获取 当前字符串c 上次出现的位置 pre = dic[c]

如果pre 在 start后面即 pre>start, 则把start 移动到 pre的下一位, start = pre + 1,
这样保证cur继续向后遍历中 从start到cur没有重复元素

否则 start不动,start移动到某一个位置,说明在这个位置之前有重复的元素了,所以start只往后移动不往回移动

这时候在衡量一下 如果 cur - start + 1 (衡量当前没重复子串开头到结尾的长度) 比 长度变量 l 大, 那就替换 l 为
cur - start + 1

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        l = 0
        start = 0
        dic = {}
        for i in range(len(s)):
            cur = s[i]
            if cur not in dic.keys():
                dic[cur] = i
            else:
                if dic[cur] + 1 > start:
                    start = dic[cur] + 1
                dic[cur] = i
            if i - start + 1 > l:
                l = i - start + 1

        return l


if __name__ == '__main__':
    s = Solution()
    # print(s.lengthOfLongestSubstring("abcabcbb"))
    # print(s.lengthOfLongestSubstring("abba"))
    print(s.lengthOfLongestSubstring("aabaab!bb"))
    # print(s.lengthOfLongestSubstring("bbbbb"))
posted @ 2022-10-07 20:39  I'm_江河湖海  阅读(13)  评论(0)    收藏  举报