本文共 2254 字,大约阅读时间需要 7 分钟。
目录
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入/输出示例:
输入 | abcabcbb |
输出 | 3 |
解释 | 因为无重复字符的最长子串是“abc”,所以其长度为3 |
这个问题本质上是一个队列应用问题。我们依次将元素放入队列中,在入队列的时候检查要入队列的元素是否存在于队列中。如果存在,需要将队列中不断的弹出元素,直到把重复的该元素弹出,然后再将该元素入队列。此外,队列中需要有一个变量记录队列长度的最长记录,在所有字符都完成过入队列操作后,将该记录返回。
class Solution: def lengthOfLongestSubstring(self, s: str) -> int: queue = SQueue() for char in s: queue.push(char) return queue.max_lengthclass 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.baseif __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)
转载地址:http://cdsoi.baihongyu.com/