LeetCode 3. 无重复字符的最长字串

题目描述

解题思路

  • 建立两个空字符串,longestSub表示当前得到的最长子串,substr表示当前通过遍历正在形成的最长子串

  • 遍历一遍字符串

    • 若当前字符不在substr中,则将其添加到substr中 若当前字符已在substr中,则:
      • 若当前形成的最长子串substr长度大于已得到的最长字串longestSub,则将substr赋值给longestSub
      • 若小于,则寻找此重复字符在原子串substr中的索引begin_indexsubstr替换为剔除掉重复字符后的字符串
  • 返回两个字符串长度的最大值,注意这里使用了substr的长度,因为如果最后一个字串都没有重复字符,即遍历结束,那么substr中直接保存了最后这一个最长子串,没有赋值到longestSub

代码

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        longestSub = ''
        substr = ''
        for index, current_str in enumerate(s):
            if current_str not in substr:
                substr += current_str
            else:
                if len(substr) > len(longestSub):
                    longestSub = substr
                begin_index = substr.index(current_str)
                substr = (substr[begin_index:] + current_str)[1:]
        return max(len(longestSub), len(substr))

提交结果

执行结果:通过
执行用时:60 ms, 在所有 Python3 提交中击败了96.35%的用户
内存消耗:13.3 MB, 在所有 Python3 提交中击败了77.76%的用户

复杂度分析

  • 时间复杂度: O ( N ) O(N) O(N),其中 N N N 是字符串的长度。
  • 空间复杂度: O ( ∣ Σ ∣ ) O(|\Sigma|) O(Σ),其中 Σ \Sigma Σ 表示字符集(即字符串中可以出现的字符), ∣ Σ ∣ |\Sigma| Σ表示字符集的大小。在本题中没有明确说明字符集,因此可以默认为所有 ASCII 码在 [ 0 , 128 ) [0, 128) [0,128) 内的字符,即 ∣ Σ ∣ = 128 |\Sigma| = 128 Σ=128。我们需要用到哈希集合来存储出现过的字符,而字符最多有 ∣ Σ ∣ |\Sigma| Σ个,因此空间复杂度为 O ( ∣ Σ ∣ ) O(|\Sigma|) O(Σ)
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页