LeetCode每日一题——无重复字符的最长子串

转载请注明作者和出处:https://blog.csdn.net/qq_28810395
运行平台: Windows 10
LeetCode官网:Fhttps://leetcode-cn.co
LeetCode每日一题——无重复字符的最长子串_第1张图片

一、无重复字符的最长子串

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

1.示例 1:

LeetCode每日一题——无重复字符的最长子串_第2张图片

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

2.示例 2:

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

3.示例 3:

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

4.示例 4:

输入: s = ""
输出: 0

5.提示:

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

二、解答思路

  移动滑窗,双指针移动,

  1. 用双指针维护一个滑动窗口去裁减字符串子串
  2. 建立一个哈希表来跟踪重复字符的最新位置
  3. 不断移动右指针,每当遇到一个重复字符char_str时,在确保左指针不往反方向移动时将其移到char_str的下一位
  4. 移动右指针的过程中,不断维护一个最大长度值并在程序末尾处返回

三、解答

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
    	#如果空字符串输出0
        if len(s) <= 1:
            return len(s)
        #创建哈希表
        hashtable={}
        index_left=0   #创建左右指针  右指针直接循环
        maxlen=0  #用作记录最长长度
        for index_right in range(len(s)): 
            char_str=s[index_right]       #依次读取当前字符
             # 如果当前字符之前重复过(重复位置为hashtable[char_str])
            if char_str in hashtable:
           		# 在确保左指针不往反方向移动时将左指针移到重复位置 + 1
                if hashtable[char_str]+1 >= index_left:
                    index_left=hashtable[char_str]+1
            # 更新当前字符最新重复位置为当前右指针位置
            hashtable[char_str]=index_right
            # 向右移动右指针,不断把最大长度保存
            maxlen=max(maxlen,(index_right-index_left+1))
        return maxlen

四、参考信息

[1]https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/kan-bu-dong-qing-da-si-wo-xi-lie-zhi-pyt-p0hm/

在这里插入图片描述

你可能感兴趣的:(leetcode,指针,字符串,leetcode,python,算法)