c与指针 从一个字符串中提取子串_LeetCode挑战二:无重复字符的最长子串

今天要挑战的是“无重复字符的最长子串”。

难度中等

题目描述:

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

示例1:

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

示例2:

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

示例3:

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

题目原始链接

解题思路:

这道题的解题思路主要是利用滑动窗口思维。

什么是滑动窗口

滑动窗口作为双指针算法的一种特殊形式,在日常算法中尤其是字符串匹配查询中经常用到。

其基本思想是通过使用特定大小的子列表,在遍历完整列表的同时进行特定的操作,以达到降低了循环的嵌套深度。

滑动窗口的基本逻辑如下:

  1. 使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。
  2. 先不断地增加 right 指针扩大窗口 [left, right],直到窗口符合要求
  3. 停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求。同时,每次增加 left,我们都要更新一轮结果。
  4. 重复第 2 和第 3 步,直到 right 到达尽头。

9f0c2cae5653070feb4d49018fcfa43e.png

代码实现

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        w = ""
        l = 0
        max_l = 0
        for c in s:
            if c in w:
                left = w.index(c) + 1
                w = w[left:]
                l -= left
            w += c
            l += 1
            if l > max_l:
                max_l = l
        return max_l

结果:

e7c9f51e6f8d4fbeb64cf393b08ffbc4.png

除了无重复字符的最长子串滑动窗口还可以用来解决连续子数组的最大和和为特定值的连续正整数序列长度最小的子数组等问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值