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替换。