【Leetcode刷题】3. 无重复字符的最长子串

题目

描述

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

示例1

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

示例2

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

示例3

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

示例4

输入: s = ""
输出: 0

提示

(1)0 <= s.length <= 5 * 104

(2)s 由英文字母、数字、符号和空格组成

解题思路

(1)对输入的s = "" 进行输出0

>>>s = ""
>>>if not s:
...    print(0)
0

(2)定义集合lookup,对输入字符串从左向右进行检索

(3)对于不包含在set中出现的元素,添加到set中,并记录当前set的长度cur_len

(4)对于包含在set中的元素,采用先进先出原则,剔除左边的元素,直到set中不含有该元素,最后将该元素加进set中,并记录当前set的长度cur_len

(5)每一次循环输入字符串的字符,如果当前set的长度cur_len大于历史记录的最大长度max_len,则将cur_len赋值给max_len

(6)遍历字符串后输出最终的max_len

代码

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if not s:return 0
        left = 0
        lookup = set()
        n = len(s)
        max_len = 0
        cur_len = 0
        for i in range(n):
            cur_len += 1
            while s[i] in lookup:
                lookup.remove(s[left])
                left += 1
                cur_len -= 1
            if cur_len > max_len:max_len = cur_len
            lookup.add(s[i])
        return max_len

Reference

题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

202xxx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值