题目:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
思路:
以下各个字符表示的含义代码中有注释
例如 s 为“abcabcbb”,
首先 i 指向 a 处,列表 b 目前为空,因此目前没有重复,count +1,字符 ‘ a’ 加入b中,i++。直到 i 指向 s 串中第二个 a 处,此时列表 b=[a,b,c],b 中含有 “a”判断重复,此时count = 3,该子串无重复的长度为3,flag 记录此时的长度,和 max 比较,若大于max,则替换max的值。s 从 b 处截取,则 s 更新为 s=‘bcabcbb’,令 i=0,b 清空,count =0,重新从s的第一个字符‘b’处开始遍历。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if s=='': # 如果s为空,则无符合题目要求的子串,即长度为0
return 0
global max # 记录目前为止最长的无重复字符子串的长度值max
max = 0
global flag # 记录当前无重复字符子串的长度值flag
flag = 0
global count # 子串长度计数
count = 0
global b # 使用列表b记录当前子串已遍历过的字符
b=[]
global i # 当前遍历s串中的位置i
i=0
while i<len(s): # s串未遍历结束时
if b.count(s[i])==0:
# 如果当前s串位置i处的字符没有在b中出现过,则说明目前的子串仍是无重复的
count+=1
b.append(s[i]) # 把当前的S串位置i处的字符加入列表b中
i+=1 # 继续查看s串中的下一个位置处的字符
continue
else: # 如果当前s串位置i处的字符在b中出现过,则说明目前的子串是重复的
flag=count
if flag>max: # 如果目前的无重复子串比之前的长,则替换
max=flag
count = 0 # 长度计数清零
beg=s.index(s[i]) # 获得S串中重复字符的位置
i=0
b.clear()
s=s[beg+1:len(s)] # 下一次遍历从没有重复的字符处开始,丢弃s串中重复的部分
if count>max:
max=count
return max
方法2:
使用滑动窗口的方法