当前位置: 首页 > 后端技术 > Python

无重复字符的最长子串

时间:2023-03-26 17:25:20 Python

给定一个字符串,请找出最长的无重复字符子串的长度。示例1:输入:"abcabcbb"输出:3解释:因为最长的无重复子串是"abc",它的长度为3。示例2:输入:"bbbbb"输出:1解释:因为最长的没有重复字符的子串是“b”,它的长度是1。例3:输入:“pwwkew”输出:3解释:因为最长的没有重复字符的子串是“wke”,它的长度是3。注意你的答案必须是子串,“pwke”是子序列,而不是子串。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode网络所有。商业转载请联系官方授权,非商业转载请注明出处。第一种解法是暴力破解,创建两个变量start和end,分别代表要检查的非重复子串的起始位置和结束位置,变量n代表当前最长的子串。start变量从头到尾遍历,end变量从start变量遍历到end,计算start到end-1的子串中是否存在end位置的变量。如果存在,说明当前查找的最长子串是end-start+1classSolution(object):deflengthOfLongestSubstring(self,s):""":types:str:rtype:int"""start=0n=0whilestartn:n=end-start+1else:breakend+=1start+=1returnn算法复杂度为O(n3)空间复杂度为O(n)方案二是滑动快速法,预置一个容量为n+1的集合变量从左向右滑动,n为当前找到的最长非重复子串的长度当设置变量在设置容量下无法匹配到新的子串时,即求最大非重复子串长度nclassSolution(object):deflengthOfLongestSubstring(self,s):""":types:str:rtype:int"""length=len(s)iflen(s)<=0:return0iflen(s)==1:返回1开始=0#最长不重复子串长度n=1whilenn:n+=1else:start+=1continuereturnn算法复杂度为O(n2),空间复杂度为O(n),可以进一步优化。遍历时可以将子串缓存到set()中,利用setlist中O(1)的搜索复杂度,算法可以优化到O(n)的复杂度classSolution(object):deflengthOfLongestSubstring(self,s):""":types:str:rtype:int"""length=len(s)iflen(s)<=0:return0iflen(s)==1:return1start=0end=0result=set()n=1whileendn:n=end-startelse:ifs[start]inresult:结果。移除(s[开始])start+=1continuereturnnslidefast连续调整数组中的slide,平均算法复杂度为O(n)