无重复字符的最长子串

题目要求:
给定一个字符串,请你找出其中不含有重复字符的最长子串 的长度
示例:

给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。

给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。

给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,”pwke” 是 子序列 而不是子串。

class Solution:		# 优化的滑动窗口解法(窗口左端为i,右端为j)
	def lengthOfLongestSubstring(self, s: 'str') -> 'int':
	    n = len(s)
	    dic = {}	# 创建字典记录位置j处出现重复字符时,窗口左端i应移到的位置
	    i = 0
	    ans = 0
	    for j in range(n):
	        if s[j] in dic:		# [i,j)范围内有与s[j]重复字符
	        	i = max(dic.get(s[j]), i)  # 窗口左端i向右滑动至字典记录的位置,i用max进行与i值筛选是为了防止当前重复字符对应i值小于单次循环前的i值,造成窗口移动后仍有重复字符串存在
	        ans = max(j - i + 1, ans)	 # 利用max函数筛选出最大长度(j - i + 1为每段无重复字符串的长度)
	        dic[s[j]] = j + 1		# dic记录j出现重复字符时,窗口左端i处应移到的位置
	    return ans
	        
class Solution:
    def lengthOfLongestSubstring(self, s: 'str') -> 'int':	#	暴力法 leetcode上提交超时
        def allUnique(s, start, end): # 判断字符串中是否存在重复字符函数,必须先定义再调用,否则报错
            Set = set()
            for i in range(start, end): # end与下面j嵌套循环使用n + 1有关
                ch = s[i]
                if ch in Set:
                    return False
                Set.add(ch)
            return True
        
        n = len(s)
        ans = 0
        for i in range(n):
            for j in range(i + 1, n + 1):	#	注意是n+1不是n
                if allUnique(s, i, j):
                    ans = max(ans, j - i)
        return ans
def lengthOfLongestSubstring(self, s: 'str') -> 'int':	#	滑动窗口解法(窗口左端为i,右端为j)
	n = len(s)	# 与优化的窗口移动法不同的是,i和j是一步步循环移动直至得到结果的
	Set = set()
	ans = 0
	i,j = 0, 0
	while i < n and j < n:
		if s[j] not in Set:
			Set.add(s[j])
			 j += 1
			ans = max(ans, j - i)
		else:
			Set.remove(s[i])
			i += 1
	return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值