給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 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)操作。