滑動視窗處理字串 LeetCode

2021-09-25 06:33:10 字數 1304 閱讀 8229

給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。

示例 1:

輸入: "abcabcbb"

輸出: 3

解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

示例 2:

輸入: "bbbbb"

輸出: 1

解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。

一開始的思路是這樣

因為使用list的index方法,當字元不在list中會丟擲valueerror,所以想到了使用異常處理模組try except。**就不貼了,效率太差勁了,難以忍受,就又找到了另一種方法,滑動視窗,似乎和kmp的思路有些類似,但是比kmp簡單很多,如下

1.遍歷字串

2.維持視窗字串的左右邊界

3.判斷當前字元是否已存在視窗字串中,若存在,則將視窗的左邊界向右滑動,即左邊界+1,視窗的右邊界是當前字元

class

solution

(object):

deflengthoflongestsubstring

(self, s)

:"""

:type s: str

:rtype: int

"""ifnot s:

return

0#使用set判斷字元是否存在時,時間複雜度為o(1)

s1 =

set(

)#當前視窗的長度,不重複的最大長度,視窗左邊界

cur_len, max_len, left =0,

0,0

n =len(s)

for i in

range

(n):

cur_len +=

1#判斷字元是否存在視窗中

#一開始用if,發現不行,原因是如果是'abbbc',只移動一次視窗會導致視窗中存在相同的字元,因此除了移動視窗,還需要移除相同字元

while s[i]

in s1:

s1.remove(s[left]

)#移除左邊界的字元,視窗向右移動

left +=

1#維持邊界

cur_len -=

1if cur_len > max_len:

max_len = cur_len

s1.add(s[i]

)return max_len

leetcode 雜湊 滑動視窗 字串

1 leetcode409 給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。在構造過程中,請注意區分大小寫。比如 aa 不能當做乙個回文字串 class solution object deflongestpalindrome self,s type s str rtyp...

String (字串雜湊 滑動視窗)

題目大意 給乙個字串s,求它連續長度為 m l 的子串s1,且s1可分為m個長度為 l 的子子串s2不相同的數量。思路 對比長度為 l 的字串是否相同,這裡用到了bkdrhash,一般來說最高效的常用hash了,存m個 l k l k 1 的雜湊值,比較是否相等,不等的話,視窗右移到最右端,依次比較...

LeetCode 字串的排列(滑動視窗)

給定兩個字串 s1 和 s2,寫乙個函式來判斷 s2 是否包含 s1 的排列。換句話說,第乙個字串的排列之一是第二個字串的子串。示例1 輸入 s1 ab s2 eidbaooo 輸出 true 解釋 s2 包含 s1 的排列之一 ba 示例2 輸入 s1 ab s2 eidboaoo 輸出 fals...