LeetCode中等题之无重复字符的最长字串
題目
給定一個字符串 s ,請你找出其中不含有重復字符的 最長子串 的長度。
示例 1:
輸入: s = “abcabcbb”
輸出: 3
解釋: 因為無重復字符的最長子串是 “abc”,所以其長度為 3。
示例 2:
輸入: s = “bbbbb”
輸出: 1
解釋: 因為無重復字符的最長子串是 “b”,所以其長度為 1。
示例 3:
輸入: s = “pwwkew”
輸出: 3
解釋: 因為無重復字符的最長子串是 “wke”,所以其長度為 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。
示例 4:
輸入: s = “”
輸出: 0
提示:
0 <= s.length <= 5 * 10^4
s 由英文字母、數字、符號和空格組成
來源:力扣(LeetCode)
解題思路
??這道題一眼看上去可以先使用暴力搜索的方法,然后對暴力搜索的關鍵步驟進行優化。首先以第一個字母為頭計算其最長字串的長度,然后以第二個…直到最后一個字母。
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:if len(s)<2:return len(s)MAX=1 #存儲最長字串的長度for i in range(len(s)):temp=s[i] #以第i個字母為頭的字串count=1 #統計字符個數for j in range(i+1,len(s)):if s[j] not in temp: #判斷下一個字母是否已經存在temp=temp+s[j] #構成字串count+=1 #更新長度if count>MAX: #更新最大字串長度值MAX=countelse:breakreturn MAX
??分析個例,比如示例1,我們首先以’a’為頭尋找最長的字串當遍歷完’c’之后發現’a’已經存在故以第一個’a’為頭的字串(‘abc’)長度最長為3,接下來繼續尋找以第二個字符’b’為頭的字串,在這里第三個字符’c’其實已經在第一次遍歷的時候依次和‘a’,‘b’對比過了,在暴力搜索的方案里這個是多比較了的,這里可以優化,那么以‘b’為頭的字串就可以直接從第四個字符‘a’開始對比并。那么在這里的優化方案其實就是我們最常用的滑動窗口,窗口每次向右滑動一個字符的長度只需要對比新加入的成員,當然滑動窗口只是優化了中間部分字符的對比。另外,一個優化小tips,可以使用python的set函數先對目標字符串進行處理如果處理后的字符串長度為1或者2,那么就可以直接返回結果了。
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:S=set(s)maxlenth=len(S) #不重復字串可能到達的最長長度if maxlenth<3:return len(S) Frame=[] #設置窗口right=-1MAX=1for i in range(len(s)):if i!=0: Frame=Frame[1:] #左指針右移while right+1<len(s) and s[right+1] not in Frame: #構造當前左指針所指字符開頭下字串的最長情況Frame.append(s[right+1]) right+=1if MAX<right-i+1:MAX=right-i+1if MAX==maxlenth:return MAXreturn MAX
總結
以上是生活随笔為你收集整理的LeetCode中等题之无重复字符的最长字串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode简单题之两数之和
- 下一篇: LeetCode简单题之自除数