【力扣】3. 无重复字符的最长子串--Python实现

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

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

示例 4:
输入: s = “”
输出: 0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters

【解题思路】
用滑动窗口来解这道题。保持滑动窗口中的元素是满足题目要求的,如果不满足的话,左边的元素出列就可以。具体的来说,维护一个集合,如果下一个元素不在集合中,就滑动窗口的右指针继续右移且把这个元素加入到集合中;如果这个元素在集合中,就需要让从左开始的元素出集合,直到把相同元素从集合中拿出,这样才是满足要求的滑动窗口,显然,这样滑一遍,就可以遍历所有不重复的字母串,找出最大的即可。用Python实现的代码如下:

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        char_set = set()
        res = 0
        start, end = 0, 0
        while end < len(s):
            if s[end] in char_set:
                res = max(res, end-start)
                while s[start] != s[end]:
                    char_set.remove(s[start])
                    start += 1
                char_set.remove(s[start])
                start += 1
            else:
                char_set.add(s[end])
                end += 1
        return max(res, end-start)



版权声明:本文为qq_36643449原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。