LEETCODE.3题解

28

题目

给定一个字符串 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 由英文字母、数字、符号和空格组成

题解

滑动窗口+哈希表解法

思路:维持一个滑动窗口,保持滑动窗口内不存在重复字符。

从第一个值开始遍历,计算每个字符之前有多长的无重复的字串(用left指针记录)

每个【字符:位置】写入哈希表中,当检测到哈希表重复的时候,说明已经有重复的值了,这时候需要检测滑动窗口的左边界大小,确定left的值。

然后在每轮中更新最大值即可。

该解法只需要一次遍历,时间复杂度O(n),存储空间复杂度线性增长,O(n):

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        length = len(s)
        if length < 2:
            return length
        # hashmap保存索引
        hashmap = {}
        maxLen = 0
        left = -1
        for i in range(length):
            if s[i] in hashmap:
                # 更新左指针
                left = max(left, hashmap[s[i]])
            # 更新索引
            hashmap[s[i]] = i
            maxLen = max(maxLen, i - left)
        return maxLen