leetcode_03. 无重复字符的最长子串

题目

leetcode题目链接

思路分析

题目要求:求不含有重复字符的 最长子串 的长度。
这题 我的第一思路就是2层循环
第一层循环,字符串从头开始遍历
第二层循环,计算每一个下标为i的元素开头的最大不连续的字符串 并计算其长度

代码展示

class Solution:
    def lengthOfLongestSubstring1(self, s: str) -> int:
    	max=0
    	for i in range(len(s)):		#第一层循环,字符串从头开始遍历
    		temp=0
    		a=[]
    		while i<len(s):			#第二层循环,计算每一个i开头的最大不连续的字符串长度temp
    			if s[i] in a:
    				break
    			else:
    				a.append(s[i])
    				temp+=1
    			i+=1
	    	if temp>max:
	    		max=temp
    	return max

结果没有通过,超出时间限制
在这里插入图片描述

思路分析(改进)

原来的第二层循环 都是把遍历到的当前节点作为结果子串的第一个节点,再次循环
造成大量的时间浪费
通过滑动窗口的思想,进行改进。

  1. 如果当前节点不在窗口里,窗口右指针向右扩展窗口
  2. 如果当前节点p在窗口里,窗口左指针向右缩小窗口,一直缩小到把和节点p元素相同的节点排除窗口
  3. 全局max记录最大值长度

代码展示(改进)

    def lengthOfLongestSubstring2(self, s: str) -> int:
    	max=0
    	a=[]		#作为 滑动窗口
    	for i in range(len(s)):
    		if s[i] not in a:
    			a.append(s[i])
    			# print("yes1",s[i],i,a)
    		else:
    			a.append(s[i])
    			j=0
    			while j<len(a):		#滑动窗口出现重复 前面的元素不断删除
    				if a[j]!=s[i]:
    					del a[0]
    				else:
    					del a[0]
    					break
    			# print("yes2",s[i],i,a)
	    	if len(a)>max:
	    		max=len(a)
    		i+=1
    	return max
    	
#########################################################

	def lengthOfLongestSubstring3(self, s: str) -> int:
    	maxlen=0
    	temp=''
    	for i in s:
    		if i not in temp:	#如果当前节点不在窗口里,窗口右指针向右扩展窗口
    			temp+=i
    			maxlen=max(maxlen,len(temp))
    		else:				#如果当前节点p在窗口里,窗口左指针向右缩小窗口,一直缩小到把和节点p元素相同的节点排除窗口
    			temp=temp[temp.index(i)+1:]
    			temp+=i
    	return maxlen
    	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值