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
运行结果


浙公网安备 33010602011771号