leetcode3: 無重複字元的最長子串](https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
阿新 • • 發佈:2020-11-13
給定一個字串,請你找出其中不含有重複字元的最長子串的長度。
示例1:
輸入: "abcabcbb"
輸出: 3
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因為無重複字元的最長子串是"wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke"是一個子序列,不是子串。
方法1:使用字典記錄位置 class Solution: def lengthOfLongestSubstring(self, s: str) -> int: d={}#存放臨時字元,鍵是字元,值是位置 maxlength=0 if len(s)<=1:#如果字串長度小於1,直接返回 return len(s) for i in range(len(s)): #如果不在字典中,增加,計算最大值 if s[i] not in d: d[s[i]]=i maxlength=max(maxlength,len(d)) else: #刪除字典中當前字元左邊的項,並更新當前字元的位置值 t=d[s[i]] tlist=list(d.keys()) for x in tlist: if d[x]<t: d.pop(x) d[s[i]]=i return maxlength
方法2:用集合,用left記錄要刪除字元的位置 class Solution: def lengthOfLongestSubstring(self, s: str) -> int: d=set() if len(s)<=1:return len(s) left=0#記錄要刪除的位置 length=len(s) maxlength=0 for i in range(length): if s[i] not in d: d.add(s[i]) maxlength=max(maxlength,len(d)) else: while s[i] in d:#刪除左邊的 d.remove(s[left]) left+=1 d.add(s[i]) #maxlength=max(maxlength,len(d)) return maxlength