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.給定字串,找到最長無重複字...