题目要求:
给定一个字符串,请你找出其中不含有重复字符的最长子串 的长度
示例:
给定 “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