给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
解析:
- 如果是空字符串的话最长字串是0。
- 创建一个字典存放字符和其对应下标。
- 将字符串中的第一个字符作为键下标作为值存入字典。
- 从字符串下标为1的位置开始遍历字符串,判断该字符是否在字典中出现,如果出现则找到字典中该字符的下标,清空字典。将该字符和下标加入到字典中,最长字串长度置为1。如果没出现则添加该字符到字典。最长字符串长度加1。直到字符串遍历结束。返回最长字串长度。
def lengthOfLongestSubstring(self, s: str) -> int:
if len(s)>0:
max_len = 1
i = 1
count = 1
dict1 ={}
dict1[s[0]]= 0
while i<len(s):
if s[i] not in dict1:
count+=1
if count>max_len:
max_len = count
dict1[s[i]] = i
i = i + 1
else:
sign = dict1[s[i]]
i = sign+2
dict1 = {}
dict1[s[sign+1]] = sign+1
count = 1
else:
max_len = 0
return max_len
摘自力扣上的解法。
解析:本质就是当访问第n+1个字符是判断该字符是否在前n个字符构成的集合中已经出现过。如果出现过删除左边第一个字符,继续判断直到将集合删除到第n+1个元素未在里面出现,每删除一次cur_len-1,left+1。如果未出现过则将该字符添加到集合中,并将cur_len+1。
def lengthOfLongestSubstring1( s: str) -> int:
if not s:return 0
left = 0
lookup = set()
n = len(s)
max_len = 0
cur_len = 0
for i in range(n):
cur_len += 1
while s[i] in lookup:
lookup.remove(s[left])
left += 1
cur_len -= 1
if cur_len > max_len:max_len = cur_len
lookup.add(s[i])
return max_len