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

LeetCode Medium|【3. 无重复字符的最长子串】

力扣题目链接
状态:在本题中,我们可以很明显得看出出现了关键字:子串、最长,所以我们肯定是选用滑动窗口来解决这个题目。
滑动窗口首先要解决的就是我们选择什么样的容器来存储数据呢?本体中是计算重复字符,我们可以使用 set、map、数组均可以解决,这里分别给出三种方法。

set

这个非常直观,和我们做的一些滑动窗口的基础题是一样的

class Solution {
public:int lengthOfLongestSubstring(string s) {std::unordered_set<char> set;int left = 0, right = 0;int ans = 0;while (right < s.length()) {char rChar = s[right];while (set.find(rChar) != set.end()) {set.erase(s[left]);left++;}set.insert(rChar);ans = max(ans, right - left + 1);right++;}return ans;}
};

map

对于 map ,我们最需要搞清楚的就是 key 和 value ,这里我们的 key 肯定是字符,然后 value 肯定是对应的下标,因为我们的 map 只能去搜索 key。

这样的话我们就不需要内层循环了,可以直接更新 left 。如何更新呢?当然就是把重复字符排除在外,但是为了防止 left 的回退,所以我们有:

left = max(left, map[rChar] + 1);

这样的代码。

class Solution {
public:int lengthOfLongestSubstring(string s) {std::unordered_map<char, int> map;int left = 0, right = 0;int ans = 0;while (right < s.length()) {char rChar = s[right];if (map.find(rChar) != map.end()) {left = max(left, map[rChar] + 1);}map[rChar] = right;ans = max(ans, right - left + 1);right++;}return ans;}
};

数组

对于数组,解法和 map 其实非常类似。
我们第一反应肯定就是 26 个英文字母,但是由于我们题目中要求了 「s由英文、数字、符号和空格组成」,所以很自然的想法就是 255 来表示 ASCII 码。

同样的,我们在数组中存储的是对应的下标位置。

class Solution {
public:int lengthOfLongestSubstring(string s) {vector<int> index(256, -1);int left = 0, right = 0;int ans = 0;while (right < s.length()) {char rChar = s[right];if (index[rChar] != -1 && index[rChar] >= left) {left = max(left, index[rChar] + 1);}index[rChar] = right; //还是隐式类型转换ans = max(ans, right - left + 1);right++;}return ans;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 41缺失的第一个正数【力扣】【C++】
  • SAP支出管理,企业成本控制的智能钥匙
  • C语言之unsigned long long与struct相互转换实例(五十六)
  • 基于 systemc-2.3.1的virtual device 接入 qemu-arm
  • 深入解析 KMZ 文件的处理与可视化:从数据提取到地图展示项目实战
  • 计算几何 点乘 两点间距离 两向量夹角
  • C++ STL copy_backward, move_backward 用法
  • B3952 [GESP202403 一级] 小杨买书
  • python实现图像分割算法4
  • AI人工智能开发环境配置
  • 【人工智能】NLP入门指南:自然语言处理基础全解析
  • 计算机毕业设计选题推荐-学生作业管理系统-Java/Python项目实战
  • 工作纪实54-git使用ssh方式
  • 【第一章】软件测试人员的成长技能树:打造全方位的技能体系
  • PHP 表单处理基础
  • (三)从jvm层面了解线程的启动和停止
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【css3】浏览器内核及其兼容性
  • 【RocksDB】TransactionDB源码分析
  • css系列之关于字体的事
  • mac修复ab及siege安装
  • php面试题 汇集2
  • Python连接Oracle
  • session共享问题解决方案
  • swift基础之_对象 实例方法 对象方法。
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 给第三方使用接口的 URL 签名实现
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 记一次删除Git记录中的大文件的过程
  • 力扣(LeetCode)22
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 设计模式走一遍---观察者模式
  • 使用 Docker 部署 Spring Boot项目
  • 算法-插入排序
  • 原生JS动态加载JS、CSS文件及代码脚本
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​什么是bug?bug的源头在哪里?
  • ‌JavaScript 数据类型转换
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #ifdef 的技巧用法
  • #NOIP 2014# day.2 T2 寻找道路
  • $jQuery 重写Alert样式方法
  • (待修改)PyG安装步骤
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二) 初入MySQL 【数据库管理】
  • (二十六)Java 数据结构
  • (算法)前K大的和
  • (一)appium-desktop定位元素原理
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • ****三次握手和四次挥手
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .mysql secret在哪_MySQL如何使用索引
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • :not(:first-child)和:not(:last-child)的用法