[滑动窗口]leetcode3. 无重复字符的最长子串

该文介绍了如何使用滑动窗口解决LeetCode中的问题——找到给定字符串中不含有重复字符的最长子串的长度。通过C++代码实现,详细解释了解题思路,包括当遇到重复字符时如何调整滑动窗口的边界,以及时间复杂度分析。同时,文章还列举了其他类似的字符串处理题目。
摘要由CSDN通过智能技术生成

一、题目

1、题目描述

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

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

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

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

2、基础框架

  • C++版本给出的基础框架如下:

3、原题链接

https://leetcode.cn/problems/longest-substring-without-repeating-characters/

二、解题报告

1、思路分析

   ( 1 ) (1) (1)使用滑动窗口,遍历字符串,如果当前字符在滑动窗口内不存在,则将其加入滑动窗口(即滑动窗口右边界扩一位)
   ( 2 ) (2) (2)如果当前字符在滑动窗口内存在,则滑动窗口左边界右移直到相同的字符不在窗口内。

2、时间复杂度

时间复杂度为O(n^2)

3、代码详解

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> vis;
        int l = 0;
        int r = 0;
        int maxlen = 0;
        while (r < s.size()) {
            while (vis.find(s[r]) != vis.end()) {
                vis.erase(s[l]);
                l++;
            }
            vis.insert(s[r]);
            r++;
            maxlen = max(maxlen, r - l);
        }
        return maxlen;
    }
};

三、本题小知识

1.滑动窗口模板
第一步,定义滑动窗口左右边界指针
第二步,根据题目逻辑控制左右边界移动
2.类似题目
159. 至多包含两个不同字符的最长子串
340. 至多包含 K 个不同字符的最长子串
30. 串联所有单词的子串
76. 最小覆盖子串
159. 至多包含两个不同字符的最长子串
209. 长度最小的子数组
239. 滑动窗口最大值
567. 字符串的排列
632. 最小区间
727. 最小窗口子序列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>