算法的关键之处在于要不断比对后面的字符与前面字符串之间有没有重复,所以提高效率也在这里。
暴搜的方法不赘述,复杂度
滑动窗口
提速的方法在于如何简化比对这一过程,自然的,使用hashset建立一个查集就可以了,每次只要查询当前字符是否在前面串中(由hashset建立),这样在使得空间复杂度为的情况下,算法复杂度就降为了.
python代码如下:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
max_count = 1
length = len(s)
if length == 0:
return 0
for i in range(length):
count = 1
# 滑动窗口
win = s[i:i+1]
for j in range(i+1, length):
if s[j] in win:
break
win = s[i:j+1]
count += 1
if count > max_count:
max_count = count
return max_count
更进一步
进一步优化算法,每次我们在滑动窗口是s[i,j]的j'位置发现了与当前查询字符重复之后,可以直接将i跳到j'开始接下来的遍历。这是因为从i到j'之间的字符串开始的滑动窗口最终找到的最长不重复子串都必定小于从i开始的滑动窗口(因为他们最终都会遇到j处的字符)