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 @ 2021-12-07 11:41  过客匆匆,沉沉浮浮  阅读(35)  评论(0)    收藏  举报