题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
理解题目说的字串的概念,字串必须是连续,而子序列可以不连续,如示例3中’wke’是字串,'pwke’是子序列。
考虑用滑动窗口,先固定左边,右边滑动,一旦窗口里面有相同元素则滑动左边,再滑动右边。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:
return 0
lookup = []
res = 0
# 当前窗口长度
cur_len = 0
for i in range(len(s)):
if s[i] not in lookup:
lookup.append(s[i])
cur_len = len(lookup)
else:
index = lookup.index(s[i])
lookup = lookup[index+1:]
lookup.append(s[i])
cur_len = len(lookup)
# 更新res
res = max(res, cur_len)
return res
用set做容易超时,用字典有点难理解,滑动窗口比较容易。