题目:
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例1
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例2
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例3
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
解题思路:
利用滑动窗口,设立两个游标,两个游标作为窗口的左右边界用来表示窗口,也就是子字符串。右边界逐次右移,同时根据情况移动左边界。当右边界读入的字符在窗口内,则将左边界移到该字符后。记录窗口的最大长度即可。
解题过程:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
dic = {} #记录字符出现的最后位置
start = 0 #滑动窗口的开始位置
re = 0
for index, ch in enumerate(s):
if ch in dic:
start = max(dic[ch], start) #如果字符在窗口内出现,则移动窗口起点
dic[ch] = index + 1 #记录每个字符最后出现的位置
re = max(re, index-start+1) #记录最大长度
return re