给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解答&思路
这里主要涉及的是滑窗算法。
滑动窗口初听觉得抽象模糊,但就像描述的那样,可以理解成是一个会滑动的窗口,每次记录下窗口的状态,再找出符合条件的适合的窗口。
就好比一个人拿着一个卷尺测字符串,要在里面找出最长且没有重复字符的子串,在上面不停地缩拉测量,记录下卷尺达到的最大长度即可。
子串就是这个卷尺的伸出部分,即一个窗口,左边缩进,右边拉出
因为不能有重复的字符,在右端逐渐拉长的过程中,每新增加的一个新字符都要拿来和左侧子串中的字符做对比
代码
我的PY代码:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if(len(s)==0):
return 0
left = 0
window = set()
n = len(s)
maxl = 0
nowl = 0
for i in range(n):
nowl += 1
while s[i] in window:
window.remove(s[left])
left += 1
nowl -= 1
if(nowl>maxl):
maxl = nowl
window.add(s[i])
return maxl
排名第一的PY代码:
class Solution:
def lengthOfLongestSubstring(self, s):
dicts = {}
maxlength = start = 0
for i,value in enumerate(s):
if value in dicts:
tmp_start = dicts[value] + 1
if start < tmp_start:
start = tmp_start
dicts[value] = i
num = i + 1 - start
if maxlength < num :
maxlength = num
return maxlength
果然香还是字典香,毕竟O(1)操作。