博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
无重复字符的最长子串(Python,LeetCode)
阅读量:4188 次
发布时间:2019-05-26

本文共 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/

你可能感兴趣的文章
《给初学者的Windows Vista的补遗手册》之062
查看>>
有道 值得一道
查看>>
《给初学者的Windows Vista的补遗手册》之057
查看>>
《给初学者的Windows Vista的补遗手册》之056
查看>>
《给初学者的Windows Vista的补遗手册》之055
查看>>
《给初学者的Windows Vista的补遗手册》之045
查看>>
域名1元价,我也来注册一个
查看>>
《给初学者的Windows Vista的补遗手册》之037
查看>>
《给初学者的Windows Vista的补遗手册》之036
查看>>
《给初学者的Windows Vista的补遗手册》之035
查看>>
Spring开发指南 0.8 发布
查看>>
Mac OS X 10.4.7 DMG 文件如何转化成ISO文件
查看>>
线程的优先级
查看>>
Khronos 官方新闻 Windows Vista 和 OpenGL 的事实 ZT
查看>>
HLSL编程实现PhotoShop滤镜效果
查看>>
如果我恨一个人,我就领他到中关村买相机。
查看>>
装ubuntu碰到一件BT的事情
查看>>
关于NVIDIA 的 OpenGL回退到软件模式的问题。
查看>>
OpenGL和D3D中Cubemap的图象方向问题
查看>>
XREAL3D开发转移到csdn的svn服务器上。
查看>>