转载请注明作者和出处:https://blog.csdn.net/qq_28810395
运行平台: Windows 10
LeetCode官网:Fhttps://leetcode-cn.co
一、无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
1.示例 1:
输入: 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
由英文字母、数字、符号和空格组成
二、解答思路
移动滑窗,双指针移动,
- 用双指针维护一个滑动窗口去裁减字符串子串
- 建立一个哈希表来跟踪重复字符的最新位置
- 不断移动右指针,每当遇到一个重复字符
char_str
时,在确保左指针不往反方向移动时将其移到char_str
的下一位 - 移动右指针的过程中,不断维护一个最大长度值并在程序末尾处返回
三、解答
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/