LeetCode 3 无重复字符的最长子串

3. 无重复字符的最长子串

难度中等3957收藏分享切换为英文关注反馈

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

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

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

1、暴力求解,效率低。

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        index_max = len(s)
        if index_max ==0:
            return 0
        if index_max == 1:
            return 1
        sub_length = 0
        lst = []
        pos = 0
        while pos < index_max:
            lst.clear()
            rest = s[pos:]
            pos += 1
            for v in rest:
                if v in lst:
                    break
                else:
                    lst.append(v)
            sub_length = len(lst) if len(lst) > sub_length else sub_length
        return sub_length

LeetCode 3 无重复字符的最长子串_第1张图片

2、移动窗口,效率高。

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        index_max = len(s)
        if index_max ==0:
            return 0
        if index_max == 1:
            return 1
        lst = []
        max_pos = 0
        pos = 0
        for i, v in enumerate(s):
            if v in lst:
                index = lst.index(v)
                # 移除之前的相同的v
                lst = lst[index+1:]
                lst.append(v)  # 增加新的v
                pos = len(lst)
            else:
                lst.append(v)
                pos += 1
            max_pos = pos if pos > max_pos else max_pos
        return max_pos

LeetCode 3 无重复字符的最长子串_第2张图片

 

你可能感兴趣的:(LeetCode)