leetcode02.无重复字符最长字串

2.无重复字符最长字串

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

1.暴力枚举法(超时!)

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        def allUnique(substr):
            # 检查子字符串中是否所有字符都是唯一的
            char_set = set(substr)
            return len(char_set) == len(substr)

        # 初始化最长无重复子字符串的长度为 0
        max_length = 0

        for i in range(len(s)):
            for j in range(i + 1, len(s) + 1):
                if allUnique(s[i:j]):
                    max_length = max(max_length, j - i)
        return max_length

​ 这个暴力解法的时间复杂度是 O(n^3),其中 n 是字符串 s 的长度。因为有两层循环来生成所有可能的子字符串,时间复杂度是 O(n^2);然后对每个子字符串调用 allUnique() 函数检查是否所有字符都是唯一的,时间复杂度是 O(n)。所以总的时间复杂度是 O(n^3)。

2.哈希表(滑动窗口)

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        start = max_string = 0#设置窗口起始开端下标为0
        char_map = {}#存储已经遍历的元素的最新位置
        for i, char in enumerate(s):#只遍历一次数组
            if char in char_map and start <= char_map[char]:#如果找到重复元素,窗口开始位置向后移动。(窗口开端<=已遍历的重复元素位置,才能保证窗口只向右移动而不会回退)
                start = char_map[char] + 1#发现重复元素,移动窗口开端
            else:
                max_string = max(max_string, i - start + 1)#每次扩大窗口时,都更新最大窗口(字串)的长度
            char_map[char] = i#将已遍历的元素添加到字典中(字典添加相同键的值时,会保留最新的值)
        return max_string

​ 这是一个经典的滑动窗口问题,我们可以使用一个字典来保存每个字符最近一次出现的位置。然后用一个指针作为滑动窗口的起点,另一个指针从左到右遍历字符串。遍历过程中,如果遇到的字符在字典中,就更新起点为当前字典中字符位置+1和当前起点的最大值,以此确保窗口中无重复字符。遍历过程中,用一个变量来保存最大的窗口大小,遍历完成后,这个变量就是最长的无重复字符的子串长度。

  • 时间复杂度是 O(n),其中 n 是字符串 s 的长度。该算法遍历了整个字符串,对每个字符最多执行两次操作:一次是检查字符是否存在于字典中,另一次是将字符添加到字典中或更新字符的位置。这两个操作的时间复杂度都是 O(1)。因此,算法的总体时间复杂度是 O(n)。

  • 空间复杂度,该算法使用了一个字典来存储字符串中的字符和它们的位置。在最坏的情况下,即字符串中所有的字符都不同,字典将存储所有的字符。因此,空间复杂度是 O(min(n, m)),其中 n 是字符串的长度,m 是字符集的大小。在 ASCII 中,m 是 128,而在 Unicode 中,m 可以是最多 1,114,112。

你可能感兴趣的:(Leetcode训练营,算法,python,leetcode)