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

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

题目描述

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

 

示例 1:

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


示例 2:

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


示例 3:

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


示例 4:

输入: s = ""
输出: 0
 

提示:

0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成

解题思路

求解这道题需要了解滑动窗口的思想。

暴力求解也尝试过,时间复杂度会很高,时间会超出限制

首先需要两个指针i 和 j 分别指向窗口的后端和前端。st是一个map,记录了当前每一个字符遍历过的最后的位置,依次遍历字符串的每一个字符,如果字符没有重复过,那么更新最大长度r,将这个字符的位置计入map中,进行下一次遍历,如果遍历到的字符存在于map中,那么从map中取出与之重复的那个字符的索引,更新窗口的后端i 的位置,比较新的字符串长度与目前最大长度,取其中的大值。

 

源码展示

复制代码
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        st = {}
        r = 0
        i = 0
        j = 0
        while j < len(s):
            if s[j]  in st:
                i = max(i,st[s[j]])
            r = max(j - i + 1,r)
            st[s[j]] = j + 1
            j += 1

        return r
复制代码

 

运行结果

 

posted @   过客匆匆,沉沉浮浮  阅读(24)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示