LeetCode - 3. 无重复字符的最长子串

写在前面:

题目链接:LeetCode - 3. 无重复字符的最长子串
题目难度:中等
编程语言:C++

一、题目描述

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

示例 1:

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

示例 2:

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

示例 3:

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

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

提示:

0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成

二、题目分析&解题思路

2.1 暴力法

先没有做题思路,老规矩,先试试暴力法:
在这里插入图片描述
这里发现,我们只要发现了重复的字符后面的就可以不继续罗列了,例如上图,我们只需要拿到,pw、wke 即可

2.1.1暴力法代码示例:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.size() <= 1)
        {
            return s.size();//注意边界值
        }
        int left = 0;
        int imax = 0;//最大的长度
        while(left < s.size())
        {
            int itemp = left;
            string strTemp = "";
            while(itemp < s.size())
            {
                if(strTemp.find(s[itemp])!=string::npos)
                {
                    if(imax < strTemp.size())
                    {
                        imax = strTemp.size();
                    }
                    strTemp = "";
                    break;//遇到有重复的直接break 即可
                }
                else
                {
                    strTemp+=s[itemp];
                }
                itemp++;
            }
            if(!strTemp.empty())//最后一次结果
            {
                if(imax < strTemp.size())
                {
                    imax = strTemp.size();
                }
            }
            left++;
        }
        return imax;//最大长度
    }
};

运行结果:
在这里插入图片描述
居然过了,但是可以看击败 9.90% 就有点鸡肋了,O(n^2) 的时间复杂度的确有点太拉了,我们再试试看有没有别的方法:

2.2 滑动窗口法:

换种思路:
在这里插入图片描述
这里我们 遍历到 pww 之后发现 w 重复,那么则需要将左侧的 p、w依次删除掉,直到 不重复为止。
继续:
在这里插入图片描述
这其实就是滑动窗口的思想,一个窗口从左至右选择,遇到重复的就将窗口左侧的字符删除掉,保证窗口内的是不重复的,并且将每次的结果记录下来即可。

2.2.1滑动窗口代码示例:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int max = 0;
        unordered_set<char> unSet;//unordered_set无序性与键值唯一性
        int left = 0;
        for(int i = 0; i < s.size();i++)
        {
            while(unSet.find(s[i]) != unSet.end())
            {
                unSet.erase(s[left]);//删除最左侧元素
                left++;
            }
            if(max < i-left+1)//记录最大值
            {
                max = i-left+1;
            }
            unSet.insert(s[i]);
        }
        return max;
    }
};

运行结果:
在这里插入图片描述
感觉效率也不是很高,才击败一半的人,然后拷了官方题解,也只击败了一半的人,emmmm 有更好的解法欢迎大家讨论。


http://www.niftyadmin.cn/n/304678.html

相关文章

Swagger简单了解

Swagger 介绍 使用swagger你只需要按照它的规范去定义接口及接口相关信息&#xff0c;在通过swagger衍生出来的一系列项目和工具&#xff0c;就可以做到生成各种格式的接口文档&#xff0c;以及在线接口调试页面等等。 官网&#xff1a;https://swagger.io/ knife4j是为javaMVC…

数字中国创新大赛·信创赛道优秀作品推荐 | 国产工业实时操作系统(Intewell)

产品介绍和功能体系 Intewell工业实时操作系统源于有30多年发展历史的“道”操作系统&#xff0c;是一款微内核实时操作系统&#xff08;RTOS&#xff09;&#xff0c;具有良好的可扩展性、友好的用户开发环境和丰富的开发调试工具&#xff0c;提供POSIX接口。Intewell工业实时…

Linux使用常见的问题

一、进程方面 &#xff08;1&#xff09;进程杀不死&#xff0c;关了之后又会自己启动&#xff0c;怎么彻底杀死&#xff1f; 1.找到它的父进程&#xff0c;然后把父进程杀了&#xff1b; 2.也可能是杀死了进程&#xff0c;相关的后台守护进程又启动一个。得要先把守护进程杀…

shell脚本之数组与冒泡排序

目录 一. 数组1.1 数组定义&#xff1a;1.2 数组包括的数据类型&#xff1a;1.3 向函数传入数组的值 二. 冒泡排序算法 一. 数组 1.1 数组定义&#xff1a; 方法一&#xff1a; 数组名&#xff08; 1 2 3 4 5 &#xff09; 方法二&#xff1a; 数组名&#xff08; [0]1 [1]2 […

训练日志中,我们可以看到训练过程中的一些关键指标

从给出的日志中&#xff0c;我们可以看到训练过程中的一些关键指标&#xff0c;这些指标有助于我们了解模型的训练过程和性能。下面是这些指标的解释&#xff1a; L1&#xff1a;这是L1损失&#xff0c;衡量预测值与真实值之间的绝对差异。这个值越小&#xff0c;表示预测越接…

Yolov8改进---注意力机制: SimAM(无参Attention)和NAM(基于标准化的注意力模块),效果秒杀CBAM、SE

🏆🏆🏆🏆🏆🏆Yolov8魔术师🏆🏆🏆🏆🏆🏆 ✨✨✨魔改网络、复现前沿论文,组合优化创新 🚀🚀🚀小目标、遮挡物、难样本性能提升 🍉🍉🍉定期更新不同数据集涨点情况 1. SimAM:无参Attention 论文: http://proceedings.mlr.press/v139/yang…

【Hive实战】Hive元数据存储库数据增多的分析

Hive元数据存储库数据增多的分析 2023年5月8日 文章目录 Hive元数据存储库数据增多的分析问题新增Hive相关的DDL操作创建Hive库库授权到用户 创建Hive表 内部表非分区表表授权到用户一级分区表二级分区表分桶表分桶排序表 查询指令核心表分析表关系图表以库表为主以hive表为主以…

ASN.1-PKCS10-x509

在国际标准ITU-T X.690 《Information technology – ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)》中定义了ASN.1编码规则。对于一般数据类型&#xff08;比如Integer、octe…