当前位置: 首页 > article >正文

leetcode(滑动窗口)3.无重复字符的最长字串(C++详细题解)DAY2

文章目录

  • 1.题目
    • 示例
    • 提示
  • 2.解答思路
  • 3.实现代码
    • 结果
  • 4.总结

1.题目

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

示例

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

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

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

请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

提示

  • 0 <= s.length <= 5 * (10^4)
  • s 由英文字母、数字、符号和空格组成

2.解答思路

滑动窗口:

  • 滑动窗口主要应用在数组和字符串上。
  • 遍历一个序列时,可以类比成队列(只能队尾进队,对头出队),一个队头指针left,一个队尾指针right

针对本题分析

1.队头指针left,先固定,向右移动队尾指针right,直至出现重复的字符,计录下此时队列长度。
2.对头指针left向后移动直至没有重复字符出现,再插入此时的队尾指针right所指字符。
3.比较记录下的队列长度的最大值,就是无重复字符的最长字串长度。

代码所需知识汇总

关于字符串string s:
s.size();//返回字符串长度
s[i] //调用下标为 i 的字符
更多字符串的成员函数见文章:C++字符串的常用操作函数全总结

关于集合:
头文件#include <unordered_set>
unordered_set < char > str; // 定义一个char类型的无序集合
str.insert(s[i]); //在集合中插入s[i]
str.find(s[i]); //在集合中查找s[i]字符,若存在会返回相应下标,若不存在会返回str.end()
str.end(); //表示集合的最后一个元素的后面
str.erase(s[i]); //删除s[i]所对应字符的下标对应字符

3.实现代码

class Solution
{
public:
    int lengthOfLongestSubstring(string s)
    {
        int n = s.size();
        if (n == 0 || n == 1)
            return n;

        unordered_set<char> str; // 无序集合
        int maxLength = 0;       // 记录最大值
        int count = 0;           // 记录每次的子串长度

        // i是队头下标,j是队尾下标
        for (int i = 0, j = 0; j < n; j++)
        {
            // 在队列找到了对应字符               
                while (str.find(s[j]) != str.end())
                {// 需要队头指针向后移直至队尾元素在子串中没有重复的字符
                    str.erase(s[i]);//删除对头下标对应字符
                    i++;//对头后移一位
                    count--;//子串字符长度减少一位
                }
                str.insert(s[j]);//将队尾所指字符插入子串str
                count++;

                if (count > maxLength)
                maxLength = count;
            }
            return maxLength;    
        }
};

结果

在这里插入图片描述
2024.2.5优化部分代码后,运行时间降低
在这里插入图片描述

4.总结

今天这题做了好长时间,cpu快烧干了,整个人都不好了。

知识储备还得多补充。。。

明天继续加油吧。


http://www.kler.cn/a/228714.html

相关文章:

  • 傅里叶变换在语音识别中的关键作用
  • 20250119面试鸭特训营第27天
  • C# 解析 HTML 实战指南
  • Visual Studio Code + Stm32 (IAR)
  • Chapter5.4 Loading and saving model weights in PyTorch
  • 飞牛 使用docker部署Watchtower 自动更新 Docker 容器
  • aspose-words基础功能演示
  • Qt PCL学习(一):环境搭建
  • flink写入es的参数解析
  • PyTorch识别验证码
  • 【云原生kubernetes系列】---亲和与反亲和
  • docker更换镜像源
  • Vue 实现动态路由
  • 恒创科技:服务器内存不足影响大吗?
  • MySQL存储引擎、事务、锁、日志
  • 异地办公必不可缺的远程控制软件,原理到底是什么?
  • docker 的常用命令
  • C#入门及进阶教程|C#基本语法(五):控制台应用程序与格式化输出
  • 乐意购项目前端开发 #6
  • WordPress主题YIA如何将首页的置顶小工具改为站长推荐小工具?
  • 【Linux】解决:为什么重复创建同一个【进程pid会变化,而ppid父进程id不变?】
  • CTFHUB SSRF POST小记
  • 2024最新版Sublime Text 4安装使用指南
  • VLM 系列——MoE-LLaVa——论文解读
  • 《Python 网络爬虫简易速速上手小册》第1章:Python 网络爬虫基础(2024 最新版)
  • Palworld幻兽帕鲁自建服务器32人联机开黑!