3. 无重复字符的最长子串 2020/10/29

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

思路是这样的:
1.利用一个队列来存储当前的字符串
2.分类,有几种情况,第一,字符没出现过,那么直接将其塞入队列即可;第二,字符出现过,那么就把出现过的字符以及它前面的字符都弹走,然后将新字符塞入即可。由于要求的是长度最大的,那么我们就要用两个变量来进行存储当前的长度以及结果长度。
需要注意的是这个方法对于长度的计算都是在出现重复中的,如果没有出现重复则在外面输出就行。

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        queue_s = []  # 作队列来存储结果
        result_len = 0  # 记录长度输出结果
        temp_len = 0  # 用作比较
        for i in s:
            if i not in queue_s:
                queue_s.append(i)
                temp_len += 1
            else:
                result_len = temp_len if temp_len > result_len else result_len
                while queue_s[0] != i:
                    del queue_s[0]
                    temp_len -= 1
                del queue_s[0]
                queue_s.append(i)
        result_len = result_len if result_len > temp_len else temp_len
        return result_len

改进:利用左右指针来构建一个队列,长度用right-left 来计量,减少内存消耗

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        left = 0
        right = 0
        result_len = 0  # 记录长度输出结果
        for right in range(len(s)):
            if s[right] not in s[left:right]:
                right += 1
            else:
                result_len = right-left if right-left > result_len else result_len
                while s[left] != s[right]:
                    left += 1
                left += 1
                right += 1
        result_len = result_len if result_len > right-left else right-left
        return result_len
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页