003——无重复字符的最长子串
作者:互联网
003——无重复字符的最长子串
1.题目
2.我的解决办法
- 思路
- 使用列表作为滑动窗口
- 使用i,j作为窗口的开始和结束指针
- 碰到重复/遍历到字符串末尾清空窗口,统计窗口最大值
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
ls = [] # 定义空列表作为滑动窗口
max_len = 0 # 最大长度
count = 0 # 滚动统计数
if len(s) == 1: # 当字符串长度为1
return 1
for i in range(len(s)): # 当字符串长度大于1
if max_len <count: # 内循环终止的情况2:没有碰到重复且遍历到字符串末尾,这时需要进行比较
max_len = count
ls.clear() # 当i指针更换时,列表清零,重新计数
count = 0
ls.append(s[i])
count += 1
for j in range(i+1, len(s)):
if s[j] in ls: # 内循环终止的情况2:碰到重复,这是需要进行比较
if(max_len < count):
max_len = count
count = 0
break
ls.append(s[j])
count += 1
return max_len
3.官方的解决办法
- 反思:最大的区别在于,官方的解决方案在左指针发生更换的时候,并没将窗口长度清除为0,而是在原来的基础之上增大窗口的长度再进行尝试
- 当发生重复之前,窗口内是不重复的,所以没有必要用clear将右指针进行改变
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 哈希集合,记录每个字符是否出现过
occ = set()
n = len(s)
# 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
rk, ans = -1, 0
for i in range(n):
if i != 0:
# 左指针向右移动一格,移除一个字符
occ.remove(s[i - 1])
while rk + 1 < n and s[rk + 1] not in occ:
# 不断地移动右指针
occ.add(s[rk + 1])
rk += 1
# 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = max(ans, rk - i + 1)
return ans
标签:子串,字符,窗口,occ,len,003,ans,指针,rk 来源: https://blog.csdn.net/TommyLiuZ/article/details/114386875