Leetcode 3無重複字元的最長子串

2021-09-29 23:33:36 字數 1843 閱讀 5987

python3

超時了,就是很傳統的那種思路:每一種子串都檢查一遍

時間複雜度極高

#

## [3] 無重複字元的最長子串

## @lc code=start

class solution:

def lengthoflongestsubstring(self, s: str) -> int:

res =

res1 =

s1=s

maxl=0

if len(list(set(s1))) == s1:

return len(s1)

else:

for i in range(len(s1)) :

for j in range(len(s1)-i):

lst = list(set(res))

#print(lst,res)

if len(lst)==len(res):#可能順序不一樣

if len(lst)>maxl:

res1=lst

maxl=len(res1)

#print("res1")

#print(res1)

res=

#lst = list(set(res1))

return maxl

# @lc code=end

採取滑動視窗的方法降低時間複雜度:**演算法

字串只迴圈檢查一遍,這樣時間複雜度只有o(n)

定義乙個可以左右拉長變短的視窗,放在字串上(首位),

如果後面的字元不在該視窗裡面,則視窗往右拉一位;

如果後面的字元被包含在該視窗裡面,記錄下該子串的長度(最長),

然後視窗左邊拉到後面那個字元所在的下乙個位置,重新拉,右邊繼續往後。

開始動手寫**就會發現,視窗的起始位置,與上次發現的佇列中已經包含的重複元素的位置有關,

所以這個視窗應該設計一種資料結構(map),包含有值(val)、字元位置(loc)兩個引數。

《然而我沒寫出來。。上面就是屁話》

參***:

他的思路是視窗每次只移動一位,資料結構使用元組代替,

只要裡面有重複元素,就把最左邊的元素刪掉,然後向右移動一位繼續判斷。

#

## [3] 無重複字元的最長子串

## @lc code=start

class solution:

def lengthoflongestsubstring(self, s: str) -> int:

map = set()

start = 0

end = 0

maxl = 0

for i in range(len(s)):

end += 1

'''if s[end] in map:

start = max(start,) #start應該是一樣的那個字元的後一位

map = s[start,end]

else:

map.join(s[end])

'''while s[i] in map:

map.remove(s[start])

start += 1

end -= 1

maxl=max(maxl,end)

map.add(s[i])

print(map,end)

return maxl

# @lc code=end

#測試用例:

#"abcabcbb" "bbbbb" "pwwkew"

#"a" "" "abcb" "***f" "au"

leetcode 3 無重複的字串

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...

leetcode 3 無重複字元的最長字元子串

堅持打卡!題目 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwk...

leetcode 3 最長無重複字串

3.longest substring without repeating characters 題面 given a string,find the length of the longest substring without repeating characters.給定字串,找到最長無重複字...