解题思路
-
建立两个空字符串,
longestSub
表示当前得到的最长子串,substr
表示当前通过遍历正在形成的最长子串 -
遍历一遍字符串
- 若当前字符不在
substr
中,则将其添加到substr
中 - 若当前字符已在
substr
中,则:- 若当前形成的最长子串
substr
长度大于已得到的最长字串longestSub
,则将substr
赋值给longestSub
- 若小于,则寻找此重复字符在原子串
substr
中的索引begin_index
,substr
替换为剔除掉重复字符后的字符串
- 若当前形成的最长子串
- 若当前字符不在
-
返回两个字符串长度的最大值,注意这里使用了
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(∣Σ∣)。