题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
知识点:
滑动窗口法
- 列表作为窗口
- 队列作为窗口
思路和代码:
1列表作为窗口
def lengthOfLongestSubstring(s):
if not s:
return 0
max_len_str = [] # 滑动窗口字符容器列表
temp_max_list = [] # 最大窗口长度值记录列表
temp_max = 0 # 最大窗口长度
for c in s:
if c in max_len_str: # 窗口出现重复字符
max_len_str.append(c) # 将字符加入窗口
temp_max_list.append(temp_max) # 记录此时窗口长度
pop_num = max_len_str.index(c) + 1 # 计算需删除的字符个数
for i in range(pop_num): # 删除重复字符及其前面的字符
max_len_str.pop(0)
temp_max = temp_max - (pop_num-1) # 更新窗口长度
else: # 无重复字符
max_len_str.append(c) # 将字符加入窗口
temp_max += 1 # 更新窗口长度
temp_max_list.append(temp_max)
return max(temp_max_list)
2队列作为窗口
class Node():
def __init__(self,value,next=None):
self.val=value
self.next=next
class myQueue():
def __init__(self):
self.head=None
self.rear=None
self.len=0
def enqueue(self,v):
node = Node(v)
self.len+=1
if self.rear:
self.rear.next=node
self.rear=node
else:
self.rear=node
self.head=node
def dequeue(self):
if self.head:
self.head=self.head.next
self.len-=1
else:
print('queue is empty')
def length(self):
return self.len
def check(self,v):
check_node = self.head
flag = False
index = 0
while check_node:
if check_node.val != v:
check_node=check_node.next
index+=1
else:
flag=True
break
return (flag,index)
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:
return 0
max_len_str = myQueue() # 滑动窗口字符容器列表
temp_max_list = [] # 最大窗口长度值记录列表
temp_max = 0 # 最大窗口长度
for c in s:
flag,indx=max_len_str.check(c)
if flag: # 窗口出现重复字符
max_len_str.enqueue(c) # 将字符加入窗口
temp_max_list.append(temp_max) # 记录此时窗口长度
for i in range(indx+1): # 删除重复字符及其前面的字符
max_len_str.dequeue()
temp_max = temp_max - indx # 更新窗口长度
else: # 无重复字符
max_len_str.enqueue(c) # 将字符加入窗口
temp_max += 1 # 更新窗口长度
temp_max_list.append(temp_max)
return max(temp_max_list)