无重复字符的最长子串

· 约 1 分钟阅读 · 次阅读 leetcode

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

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

示例 2: 输入: s = “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

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

提示: 0 <= s.length <= 5 * 104 s 由英文字母、数字、符号和空格组成


队列方法

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        result = []
        count = 0
        ans = 0
        for e in s:
            while e in result:
                result.pop(0)
                count = count - 1
            result.append(e)
            count += 1
            ans = max(count, ans)
        return ans
                

双指针的思路

使用队列,在查找效率方面比较低,改为双指针。 时间复杂度O(n), 空间复杂度O(k)

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        allchar = dict()
        ans = 0
        i =0
        j = 0
        while j < len(s):
            while s[j] in allchar:
                allchar.pop(s[i])
                i += 1
            allchar[s[j]] = j
            count = j - i + 1
            j += 1
            ans = max(ans, count)
        return ans