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
运行结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了