【Leetcode面试常见题目题解】2. 无重复字符的最长子串

news2024/11/22 15:30:32

题目描述

本文是LC第3题:无重复字符的最长子串。
题目描述如下

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

举例

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

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

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

解题思路

子串:连续的。比如 adbcdf中,adbbcd都是子串,但af不是子串,因为违背了连续性。
无重复:也就是子串中的字符不能重复。

暴力解题

在这里插入图片描述
直接上手,我们很容易想出暴力解题的思路。

  1. 定义两个指针,初始都指向下标 0;
  2. 每次向右移动 R指针,直到R指针指向的当前元素与 arr[L~R-1] 之间的元素发生重复,则记录下当前 arr[L ~ R-1] 的子串长度,然后右移动L指针;
  3. 然后继续步骤2。

可以写出如下伪码

int l = 0, r = 0, max = 1;
while (r < n) {
	if (is_exits(arr[r], arr, l, r-1) == true) { // arr[r] 与 arr[l ~ r-1] 之间的某个元素相同
		if (r - l > max) max = r - l; // 记录下当前子串的长度
		l++; // l右移,继续判断
	}
}

is_exits 必定是一个循环,因此,这样的算法写出来就是双层循环。
也可以采取哈希表来进行 is_exists 的判断,将双层循环替换为单层的,代价是空间复杂度变为O(n)。以下是采取哈希表的代码实现:

class Solution {
public:
    unordered_map < char, int > hashTable;
    int lengthOfLongestSubstring(string s) {
        int maxLength = 0;
        int i = 0;
        for ( int j = 0; j < s.length ( ); ++j ) {
            auto tmp = hashTable.find ( s [ j ] );
            /*
            if (  tmp == hashTable.end ( ) ) // s [ j ] 不在集合内
                hashTable [ s [ j ] ] = j;
            else {//  s [ j ] 在 集合内
                for ( int k = i; k < idx; ++k ) hashTable.erase ( s [ k ] ); // 删除集合里重复字符之前的元素
                hashTable [ s [ j ] ] = j;  // 改变重复字符的value值
                i = tmp -> second + 1; // i 标定左边界
            }
            */
            if ( tmp != hashTable.end ( ) ) {
                int idx = tmp -> second;
                for ( int k = i; k < idx; ++k ) hashTable.erase ( s [ k ] );
                i = idx + 1;
            }
            hashTable [ s [ j ] ] = j;
            maxLength = max ( maxLength, j - i + 1 );
        }
        return maxLength;
    }
};

优化解法

但此题,只要求我们求其长度,上面的做法将子串也同时求了出来,因此,我们再找找更简单的解法。
我们可以使用HashMap来建立字符和其出现位置之间的映射。
上面的暴力解法实际上是维护了一个滑动窗口,窗口内的都是没有重复的字符,我们需要尽可能的扩大窗口的大小。
而此题跟位置相关,由于窗口在不停向右滑动,所以我们只关心每个字符最后出现的位置,并建立映射。
窗口的右边界就是当前遍历到的字符的位置,为了求出窗口的大小,我们需要一个变量left来指向滑动窗口的左边界。

  • 这样,如果当前遍历到的字符从未出现过,那么直接扩大右边界,
  • 如果之前出现过,那么就分两种情况,在或不在滑动窗口内,
    • 如果不在滑动窗口内,那么就没事,当前字符可以加进来,
    • 如果在的话,就需要先在滑动窗口内去掉这个已经出现过的字符了,去掉的方法并不需要将左边界left一位一位向右遍历查找,由于我们的HashMap已经保存了该重复字符最后出现的位置,所以直接移动left指针就可以了。

我们维护一个结果res,每次用出现过的窗口大小来更新结果res,就可以得到最终结果了。

实现代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        vector<int> idx(256, -1); // 记录位置,用数组模拟哈希表,数组下标代表 256 个字符的 ascii码。	        	
        int start = -1; // 初始设置为 -1
        int maxLength = 0;
        for ( int i = 0; i < s.length(); ++i ) {
            if ( idx[s[i]] > start ) { 
                start = idx[s[i]];    
            }
            idx[s[i]] = i;
            maxLength = max(maxLength, i-start); // 最大长度更新
        }
        return maxLength;
    }
};

其中, idx[s[i]]记录的是 s[i]表示的字符最后一次出现在字符串中的位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html实现酷炫的公司年会抽奖(附源码)

文章目录1.设计来源1.1 主界面1.2 抽奖效果1.2 中奖效果2.效果和源码配置2.1 动态效果2.2 员工信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/128640998 ht…

AI绘画日漫欧漫动态表情换脸游戏风生成红包封面流量主小程序开发

AI绘画日漫欧漫动态表情换脸游戏风生成红包封面流量主小程序开发 因全网AI绘画大量小程序被封禁下架。只有采用合规稳定运营引擎。 文生图图动日漫图生欧漫图转动图人物表情变脸换脸3D动漫集成7大AI制图模式 支持个人模式和企业支付。趣味AI制图支持流量主。 打造一款适合个人…

uniapp 画中画悬浮窗(视频) Ba-VideoPip

简介&#xff08;下载地址&#xff09; Ba-VideoPip 是一款画中画方式的视频悬浮窗插件。支持点播、直播&#xff1b;支持官方、三方播放器无缝切换&#xff1b;支持动态刷新&#xff08;如切换视频或进度&#xff09;。 支持点播、直播支持官方、三方播放器无缝切换支持动态…

【unity3D】Collider碰撞器组件

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的Collider碰撞器组件 Collider碰撞器组件▶碰撞器类别▶Box Collider▶Sphere Collider▶Box Collider 2D▶Composite Collider 2…

Aspose.Words for .NET Crack 23.1.0

Aspose.Words for .NET Crack Aspose.Words 及其产品系列是一组 Word 文档&#xff0c;它们处理 API 以创建、编辑、打印、阅读和稍后转换所有格式化的 Word 文档和文件格式&#xff0c;就在 .NET、Java、Android 中、Cloud、SSRS、SharePoint 以及最后但并非最不重要的 Jasper…

【fpdlink显示】DS90UB948关于941连接948 GPIO调试问题

1. 前言 使用一个941连接2 948显示: 941的GPIO0/1/2/3到前948的GPIO0/1/2/3和941的D_GPIO0/1/2/3到948的GPIO0/1/2/3。 设置gpio3输出,则941的D_GPIO3设置高,而948的gpio3设置不高; 但设置gpio3输入后,看到941的D_GPIO3跟随948的gpio3变化。 2. 原理图连接 3. 测试代码…

通过图像了解 Git

我受到Nico Riedmann 的 Learn git concepts, not commands 的启发&#xff0c;我用我自己的方式总结了 git。当然&#xff0c;我也通过阅读官方文档来补充它。从系统结构上理解git&#xff0c;让git更有趣。我最近对 git 上瘾了&#xff0c;以至于我正在创建自己的 git 系统。…

Java集合常见面试题(一)

集合概述 Java 集合&#xff0c; 也叫作容器&#xff0c;主要是由两大接口派生而来&#xff1a;一个是 Collection接口&#xff0c;主要用于存放单一元素&#xff1b;另一个是 Map 接口&#xff0c;主要用于存放键值对。对于Collection 接口&#xff0c;下面又有三个主要的子接…

HarmonyOS智能座舱体验是怎样炼成的?立即查看

目录 一、智能座舱的人因设计理念 1.驾驶场景“2s内安全交互” 2.屏幕信息科学布局 3.屏幕1:2比例特色分屏 二、如何对座舱应用高效设计开发 1.基础要求 2.开发禁止 3.更佳体验 1.音频类应用快速接入 2.手机服务卡片快速适配 三、软硬件联合打造优秀体验 1.小憩模式 2.K歌体验 …

RepVGG:让VGG风格的ConvNets再次伟大

论文地址&#xff1a;https://arxiv.org/abs/2101.03697 我们提出了一种简单但功能强大的卷积神经网络结构&#xff0c;该模型在推理时类似于VGG&#xff0c;只有33的卷积和ReLU堆叠而成&#xff0c;而训练时间模型具有多分支拓扑结构。训练时间和推理时间结构的这种解耦是通过…

李宏毅ML-局部最小值与鞍点

局部最小值与鞍点 文章目录局部最小值与鞍点1. Optimization 没有做好是因为什么&#xff1f;2. Local Minima or Saddle Point&#xff1f;3. 如何解决 Saddle Point?1. Optimization 没有做好是因为什么&#xff1f; 观察下图&#xff0c;随着 update 的次数增加&#xff0…

MFC或C/C++中如何判断目录存在,文件/文件夹存在,亦或是文件夹存在,文件存在

判断的方式太多太多&#xff0c;这里暂时列举5中方式。 在文章开始之前&#xff0c;由于需要用到CString转char功能&#xff0c;所以先介绍一个CString转char的方法&#xff1a; 想知道更多参见CString与char *互转总结 由于本文使用的Unicode编码模式&#xff0c;所以如下&…

链动2+1商业模式的玩法是怎么样的?

如果你感觉自己的产品卖不掉&#xff0c;很可能是因为缺乏一种成功业务模型&#xff0c;因此我们来聊聊运营商业运营模式理论&#xff1a;从一个销售产品到一个商业运营模式的高速发展&#xff0c;我们不能把它简单的当做是一种营销方法&#xff0c;也就是一种产品的营销方法。…

六、MySQL 数据库练习题1(包含前5章练习题目及答案)

文章目录一、数据库概述练习题二、MySQL 环境搭建练习题三、查询练习MySQL 数据库练习题(包含前5章所有知识点及答案) 前置知识&#xff1a; 一、数据库开发与实战专栏导学及数据库基础概念入门 二、MySQL 介绍及 MySQL 安装与配置 三、MySQL 数据库的基本操作 四、MySQL 存储…

PrimalSQL 2023 Crack

PrimalSQL 2023 使数据库查询开发和测试变得轻而易举&#xff0c;无论您的数据库类型或供应商如何。 通过单个工具支持多个数据库提供程序。 Access、SQL Server、SQL Server Compact、MySQL、Oracle、ODBC、OLEDB、Sybase 等。 使用Visual Query Builder构建复杂的查询。 使…

Steam/CSGO游戏搬砖1月行情分析及应对方法

Steam/CSGO游戏搬砖1月行情分析及应对方法 这几天&#xff0c;我看很多地方还在对外宣称说这个项目有百分之十几&#xff0c;二三十的利润率&#xff0c;多么无敌和暴利&#xff01; 天啦 &#xff0c;这些人为了能割到小白的韭菜真是无所不用其极&#xff0c;什么牛都能吹得出…

外包和外派

前言 简单介绍下人们常说的外包是什么&#xff0c;应届生未出社会没有经验&#xff0c;避免求职过程中的一些坑。 文章目录前言一、什么是外包&#xff1f;1、简介1、项目外包2、人力外包二、外包公司有哪些&#xff1f;三、优缺点1、优点2、缺点四、选择一、什么是外包&#x…

海思SS928V100开发(2)镜像烧录

1. 开发板没有uboot 在\01.software\pc\ToolPlatform下,打开烧写工具ToolPlatform如下: 选择 “烧写eMMC”,并添加fastboot,kernel,rootfs,如下图: 然后点击 烧写,进入烧写模式(注意:检查串口选择是否正确,传输方式选择 网口): 烧写完成uboot,kernel和rootf后的…

流媒体协议之RTMP详解

流媒体协议之RTMP详解 文章目录流媒体协议之RTMP详解1 RTMP概述2 RTMP交互过程2.1 握手协议2.2 RTMP分块&#xff08;chunk&#xff09;2.3 协议控制消息&#xff08;Protocol Control Message&#xff09;2.4 RTMP Message Format2.5 不同类型的RTMP Message2.6 RTMP Massage和…

【Linux多线程编程】7. 线程锁(4)——信号量

前言 上篇文章Linux多线程编程】6. 线程锁&#xff08;3&#xff09;——条件变量 介绍了使用条件变量实现多线程同步的方式&#xff0c;而条件变量一般与互斥锁一同配合。本文介绍多线程同步的另一种方式——信号量&#xff0c;使用比条件变量简单&#xff0c;也用来解决生产…