給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
思路:藉助兩個指針(head, tail) 來維護一個滑動窗口,再利用一個 dict 來保存每個字符的最新的角標。 利用 head 指針遍歷數組,每過一個字符,更新 dict 的key,發現相同字符時,計算 head 與 tail 指針的長度,記錄最大值。
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
max_len = 0
head = 0
tail = -1
letters = dict()
while head < len(s):
if s[head] in letters.keys(): # 該字母已經出現過
tail = max(tail,letters[s[head]]) # 不能以小於tail的位置來計算,因爲會有重複字母,例如:abba
letters[s[head]] = head
if head - tail > max_len:
max_len = head - tail
head = head + 1
return max_len