日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

LeetCode中等题之无重复字符的最长字串

發布時間:2023/11/28 生活经验 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中等题之无重复字符的最长字串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。