LeetCode3.无重复字符的最长子串(图解算法)
Posted Dream丶Killer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode3.无重复字符的最长子串(图解算法)相关的知识,希望对你有一定的参考价值。
题目来源:力扣(LeetCode)
题目描述:
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
示例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 * 10^4
s
由英文字母、数字、符号和空格组成
解题思路:
滑动窗口 + 双指针
设置双指针, left
指向窗口的左端, right
指向窗口的右端的下一个元素,窗口的大小为 right - left
。首先,设置 left=0
, right=1
,固定 left
,不断移动 right
,直到 right
指向的元素在当前窗口中已存在,然后,找到该元素在窗口中的位置,并将头指针指向该位置的下一个位置;或者 right
移动到了边界外,此时比较 max_str
与 right - left
的大小,返回最大子串。
python实现
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
length = len(s)
# 即长度为0或1,len(s)即为最长子串
if length < 2:
return length
# 初始化left,right两个指针
left, right = 0, 1
# 最长长度设置为1
max_str = 1
# 退出条件,right到达边界
while right < length:
# 当right未到达边界,且right指向的元素没有出现在子串中
while right < length and s[right] not in s[left: right]:
# right指针右移
right += 1
max_str = max(max_str, right - left)
# 当right未到达边界
if right != length:
# 将left指针移动到重复元素的下一个位置
left += s[left: right].index(s[right]) + 1
return max_str
以上是关于LeetCode3.无重复字符的最长子串(图解算法)的主要内容,如果未能解决你的问题,请参考以下文章