1 问题描述
给定一个字符串,统计其中没有重复字符的最长子串的长度。
2 代码实现
这题如果想到用哈希表来实现就不算太难,下面的代码放出的是我独立思考之后的结果,看了官方题解之后了解到这种方法的名称是滑动窗口,想想非常贴切。
具体来说就是,我们用一个哈希表来存储字符串中出现的字符,以字符为key,存储value的是该字符在当前字符串中的最新下标。
用l_
来存储每个无重复字串的长度,如果新加入的字符之前从未见过,那就令l_+1
,否则,判断这个字符前一次出现的位置,如果是在滑动窗口之前,那不需要进行额外操作,不然就要修改当前的滑动窗口范围,这里都是通过head
来实现,滑动窗口的尾部始终是最新遍历到的字符。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
ls = len(s)
l = 0
if ls > 0:
si = {}
l = 0 # 字符串的最大无重复子串长度
l_ = 0 # 每个无重复字串的长度
head = 0 # 当前滑动窗口的起始索引的前一个位置
for i in range(ls):
if s[i] in si:
l = max(l, l_)
if si[s[i]] > head:
head = si[s[i]]
l_ = i - head
si[s[i]] = i
else:
si[s[i]] = i
l_ += 1
l = max(l, l_)
return l
这个方法比Leetcode的官方题解更加简洁一些,不需要多次循环,只需要遍历一次字符串即可,因此时间复杂度为 O ( n ) O(n) O(n),极端情况下哈希表要存储所有字符类型,因此空间复杂度为 O ( 128 ) O(128) O(128),即128中ASCII码。