1.背景
Leetcode專欄目的:希望給學習算法的朋友提供一些想法,也希望有大佬能夠通過評論提供寶貴的意見。
Leetcode專欄方式:將展示實現代碼的多種實現方式,並且對算法複雜度進行比較。由於筆者偏好,代碼全部使用python實現。
本期題目: https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
2.解題方式
本題由展示兩種解題方式
2.1 方法1:暴力求解
暴力求解的方式就是生成所有字串,然後驗證是否複合無重複條件。該方法的時間複雜度較高,不可取。
- 生成所有字串需要雙重for循環,時間複雜度O(n^2)
- 驗證字串:使用hash時間複雜度O(n),使用雙指針O(n^2)
- 總體來看時間複雜度爲O(n^3)、O(n ^4)
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
l = len(s)
for lenght in range(l,0,-1):
for i in range(l-lenght+1):
substr = s[i:i+lenght]
if len(substr) == len(list(set(substr))):
return len(substr)
return 0
2.2 方法2:滑動窗口
另外一種方式是使用滑動窗口的方式,代碼如下:
class Solution:
def lengthOfLongestSubstring(self, s:str) ->int:
k, res, c_dict = -1, 0, {}
for i, c in enumerate (s):
if c in c_dict and c_dict[c] > k:
k = c_dict[c]
c_dict[c] = i
else:
c_dict[c] = i
res = max(res, i-k)
return res
3. 總結
滑動窗口總結:
- 時間複雜度較低,是需要一次便利,即O(n)
- 利用hash實現快速搜索
- 利用鍵值對實現非重複指針k替換。