題目:
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
個人思路:
遍歷,遇到相同字符則找出當前子串該字符的位置將指針前移。但找相同字符的位置很難實現。
官方答案推薦:
①遇到子串即考慮用滑動窗口的思想。首指針每次前進一步,集合中移除首指針指向的字符,尾指針保持不動。
②原字符串視爲每次增加一個字符,比較當前最長無重複子串長度和增加字符後從後往前的最長無重複子串長度
python代碼:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
curSet = set()
endIndex = 0
length =0
strLength = len(s)
for i in range(strLength):
if i>0:
curSet.remove(s[i-1])
while(endIndex<strLength and s[endIndex] not in curSet):
curSet.add(s[endIndex])
endIndex +=1
length = max( endIndex - i,length)
return length
反思:
一開始把從集合中移除的操作放在後面了。。。