最长无重复子串
无重复字符的最长子串
这个问题两个思路,要么进行遍历暴力破解,要么进行滑动窗口(巧妙),下面先看一下暴力解法:
class Solution: def lengthOfLongestSubstring(self, s: str) -> int: s_count = len(s) max_list = [] if s_count == 0: return 0 else: # 两层的遍历 for i in range(s_count): tmp = s[i] max_list.append(tmp) for j in range(i+1, s_count): tmp += s[j] max_list.append(tmp) # 然后用set 判断子串是否有重复 return max([len(i) for i in max_list if len(set(list(i))) == len(i)])
这个时间复杂度是N方,下面看一下滑动窗口的解法,我来一个left和right,然后用right遍历,如果有重复子串,我就删除left,知道没有重复为止,这个思路太可以了。
class Solution: def lengthOfLongestSubstring(self, s: str) -> int: left = 0 s_len = len(s) max_count = 0 # 用set 来记录最长无重复子串 max_set = set() # right 遍历 s for right in range(s_len): # 如果在set 中 我就删除左边的 直到没有重复为止 while s[right] in max_set: max_set.remove(s[left]) left += 1 max_set.add(s[right]) max_count = max(max_count, right - left + 1) return max_count
滑动窗口的时间复杂度是O(N),提高不少。