给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
方法1:使用字典记录位置
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
d={}#存放临时字符,键是字符,值是位置
maxlength=0
if len(s)<=1:#如果字符串长度小于1,直接返回
return len(s)
for i in range(len(s)):
#如果不在字典中,增加,计算最大值
if s[i] not in d:
d[s[i]]=i
maxlength=max(maxlength,len(d))
else:
#删除字典中当前字符左边的项,并更新当前字符的位置值
t=d[s[i]]
tlist=list(d.keys())
for x in tlist:
if d[x]<t:
d.pop(x)
d[s[i]]=i
return maxlength
方法2:用集合,用left记录要删除字符的位置
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
d=set()
if len(s)<=1:return len(s)
left=0#记录要删除的位置
length=len(s)
maxlength=0
for i in range(length):
if s[i] not in d:
d.add(s[i])
maxlength=max(maxlength,len(d))
else:
while s[i] in d:#删除左边的
d.remove(s[left])
left+=1
d.add(s[i])
#maxlength=max(maxlength,len(d))
return maxlength