3.无重复字符的最长子串-lengthOfLongestSubstring

链接

LeeCode-3-无重复字符的最长子串

参考

知乎

Git

题目描述

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

示例:

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

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

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

实现(python3)

charDict存储每个字符以及字符出现的最后的位置,
res为当前最长的的子串长度,
st当前无重复子串的最左边字符的位置

class Solution():
    def lengthOfLongestSubstring_1(self, s):
        if s == None or len(s) <= 0:
            return
        charDict, res, st = {},0,0
        for i, ch in enumerate(s):
            if ch not in charDict or charDict[ch] < st:
                res = max(res, i -st +1)
            else:
                st = charDict[ch]+1
            charDict[ch] = i
        return res

滑动窗口,不满足要求就移动这个队列,把队列的左边的元素移出

class Solution():
    def lengthOfLongestSubstring_2(self, s):
        if not s:return 0
        left = 0
        lookup = set()
        n = len(s)
        max_len = 0
        cur_len = 0
        for i in range(n):
            cur_len += 1
            while s[i] in lookup:
                lookup.remove(s[left])
                left += 1
                cur_len -= 1
            if cur_len > max_len:max_len = cur_len
            lookup.add(s[i])
        return max_len

s = Solution()
print(s.lengthOfLongestSubstring_2('pwwkew'))

你可能感兴趣的:(3.无重复字符的最长子串-lengthOfLongestSubstring)