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=0right=1 ,固定 left ,不断移动 right ,直到 right 指向的元素在当前窗口中已存在,然后,找到该元素在窗口中的位置,并将头指针指向该位置的下一个位置;或者 right 移动到了边界外,此时比较 max_strright - 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.无重复字符的最长子串(图解算法)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode3. 无重复字符的最长子串

LeetCode3. 无重复字符的最长子串

leetcode3 无重复字符的最长子串

LeetCode3. 无重复字符的最长子串

LeetCode3 无重复字符的子串

滑动窗口6:LeetCode3.无重复字符的最长子串