目录
题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入/输出示例:
| 输入 | abcabcbb |
| 输出 | 3 |
| 解释 | 因为无重复字符的最长子串是“abc”,所以其长度为3 |
解决方案
这个问题本质上是一个队列应用问题。我们依次将元素放入队列中,在入队列的时候检查要入队列的元素是否存在于队列中。如果存在,需要将队列中不断的弹出元素,直到把重复的该元素弹出,然后再将该元素入队列。此外,队列中需要有一个变量记录队列长度的最长记录,在所有字符都完成过入队列操作后,将该记录返回。
代码
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
queue = SQueue()
for char in s:
queue.push(char)
return queue.max_length
class SQueue(object):
def __init__(self):
self.base = []
self.max_length = 0
def push(self, data):
if self.exist(data):
self.remove(data)
self.base.append(data)
if self.length() > self.max_length:
self.max_length = self.length()
def pop(self):
return self.base.pop(0)
def remove(self, data):
while True:
element = self.base.pop(0)
if element == data:
break
def length(self) -> int:
return len(self.base)
def exist(self, data) -> bool:
return data in self.base
if __name__ == '__main__':
result = Solution().lengthOfLongestSubstring("aabaab!bb")
print(result)
代码走读
# 解决方法类(LeetCode定义)
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 将所有字符依次加入队列中
queue = SQueue()
for char in s:
queue.push(char)
# 返回队列最大长度记录
return queue.max_length
# 自定义队列
class SQueue(object):
def __init__(self):
self.base = []
# 对大长度记录
self.max_length = 0
# 加入队列
def push(self, data):
# 如果要加入的元素在队列中已存在,则需要依次将部分元素出队列
if self.exist(data):
self.remove(data)
self.base.append(data)
# 判断是否达到最大长度记录
if self.length() > self.max_length:
self.max_length = self.length()
# 弹出队列头的元素
def pop(self):
return self.base.pop(0)
# 弹出一个指定的元素。并将该元素前的所有元素弹出队列
def remove(self, data):
while True:
element = self.base.pop(0)
if element == data:
break
# 当前队列的长度
def length(self) -> int:
return len(self.base)
# 判断一个元素是否在队列中存在
def exist(self, data) -> bool:
return data in self.base
# 自测用例
if __name__ == '__main__':
result = Solution().lengthOfLongestSubstring("aabaab!bb")
print(result)
825



被折叠的 条评论
为什么被折叠?



