问题描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是子串的长度,“pwke” 是一个子序列,不是子串。
解题思路
滑动窗口思想,每到一个字符的位置,则判断该字符是否与子串中的字符重复,若没有则继续遍历,若重复,则将当前子串与结果子串的长度对比,取长度大的作为新的结果子串,并将当前子串清空,从此次遍历的初始位置的下一个位置继续滑动。
代码实现
def lengthOfLongestSubstring(self, s: str) -> int:
# 结果字符串
res = ""
# 中间子串
middle = ""
n = len(s)
i=0
flag = 0
while i<n:
# 如果字符不在子串里面,则直接拼接
if s[i] not in middle:
middle += s[i]
# 若子串出现了重复
else:
# 判断当前子串长度是否大于结果字符串,若是,则更新结果子串
if len(middle)>len(res):
res = middle
# 在上次遍历的初始位置的下一个位置重新开始遍历
i = flag+1
flag+=1
middle = s[i]
i+=1
# 这是为了防止中间子串一次遍历未出现重复时,漏掉了结果
if len(middle)>len(res):
res = middle
return len(res)
复杂度
时间复杂度:O(n)
空间复杂度:O(n)