給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。
示例 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...