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

文章目录

  • 一、题目
    • 1、题目描述
    • 2、基础框架
    • 3、原题链接
  • 二、解题报告
    • 1、思路分析
    • 2、时间复杂度
    • 3、代码详解
  • 三、本题小知识

一、题目

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. 最小窗口子序列

你可能感兴趣的:(算法刷题,算法,leetcode,数据结构)