Leetcode:无重复字符的最长子串

普通版本(哈希表 + 滑动窗口)

题目链接:3. 无重复字符的最长子串 - 力扣(LeetCode)

//方法一:
class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_map<char,int> st;int len = 0;int sz = s.size();for(int right = 0,left = 0; right < sz; right++){if(st.find(s[right]) != st.end()) // 在哈希表中找到当前位置的字符{left = max(left, st[s[right]] + 1); // 更新左指针,加1避免重复字符}st[s[right]] = right; // 更新哈希表记录len = max(len, right - left + 1);//取之前记录的子字符串长度和right~left间的子字符串长度中的最大值}return len;}
};方法二:
class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_map<char, int> st;int len = 0; // 最终结果int tmp = 0;int sz = s.size();int left = 0;for(int right = 0; right < sz; right++) {if (st.find(s[right]) != st.end()  ) //用于保证st[s[right]] >= left{len = max(len, right - left);left = max(left,st[s[right]] + 1); // right遇到重复字符,更新left}st[s[right]] = right; // 更新哈希表}len = max(len, sz - left); // 处理只有一个空字符 或 没有字符的情况return len;}
};
  • 空格也是字符
  • right负责探路实际的子串是[left,right)
  • unordered_map的find返回值是迭代器不是布尔,调用[]返回的是对传入的键对应的值的引用
  • 使用unordered_map<char,int>是为了更好的更新left的位置,因为unordered_map不会出现重复字符,我们遇到相同字符时先用之前存好的重复位置更新+1使得left跳过该字符后(为了保证[left,rigth)间不会再有重复字符,如果只是left+1可能还会有重复字符),再更新重复字符的新位置(此时[left,right)中的字符都是不重复的)

 unordered_map<char,int> st可以回顾下map和set:C++的map和set-CSDN博客 

优化版本(动态规划 + 哈希表)

1、设动态规划列表dp,dp[ j ]代表以字符 s[ j ]为结尾的 “最长不重复子字符串” 的长度

class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_map<char, int> st;int res = 0, tmp = 0, len = s.size(), i;for(int right = 0; right < len; right++) {if (st.find(s[right]) == st.end()) i = - 1;else i = st.find(s[j])->second; // 获取索引 ist[s[right]] = right; // 更新哈希表tmp = tmp < right - i ? tmp + 1 : right - i; // dp[j - 1] -> dp[j]res = max(res, tmp); // max(dp[j - 1], dp[j])}return res;}
};
  • continue会使得程序跳过迭代表达式(也就是i++)

~over~

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

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

相关文章

【Linux】文件系统和软硬链接

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

Java 服务挂掉,服务器异常宕机问题排查

目录 Java 服务挂掉&#xff0c;服务器异常宕机问题排查一、初步排查1. 检查日志文件2. 查看资源使用情况 二、详细排查1. 内存问题2. CPU 问题3. 磁盘和网络 I/O 三、系统性优化和预防1. 配置监控和报警2. 优化 JVM 参数3. 代码优化 四、案例分享案例一&#xff1a;内存泄漏导…

redux相关源码

1、createStore 实现 2、connct实现 3、bindActionCreators实现 4、Provider实现 5. thunk

html+css web前端 多边形

<!DOCTYPE html><html><head><meta charset"UTF-8"><title>多边形</title><style type"text/css">#pentagon_6_1 {position: absolute;top: 0px;height: 0; width: 100; border-left: 100px solid rgb(255, 255…

【记忆化搜索 】2312. 卖木头块

本文涉及知识点 记忆化搜索 LeetCode2312. 卖木头块 给你两个整数 m 和 n &#xff0c;分别表示一块矩形木块的高和宽。同时给你一个二维整数数组 prices &#xff0c;其中 prices[i] [hi, wi, pricei] 表示你可以以 pricei 元的价格卖一块高为 hi 宽为 wi 的矩形木块。 每…

网络四层、七层协议

一、OSI七层模型 物理层&#xff1a;建立、维护、断开物理连接。 数据链路层&#xff1a;逻辑连接、寻找硬件地址——地址解析协议&#xff1a;ARP、PARP 反向地址转换协议 网络层&#xff1a;寻找逻辑地址&#xff0c;实现不同网络之间的路径选择——ICMP(互联网控制信息协议…

Vue前端平台的搭建

文章目录 前端平台搭建(`Vue2.6`,App:`HBulderX`)创建`Vue2.6`项目下载相应插件方便开发路由配置对连接后端进行一些配置(`main.js`文件)导入ElementUI组件[组件 | Element](https://element.eleme.cn/#/zh-CN/component/icon)同步与异步`axios`异步请求框架前端平台搭建(Vue2.…

YoloV8改进策略:卷积篇|基于PConv的二次创新|附结构图|性能和精度得到大幅度提高(独家原创)

摘要 在PConv的基础上做了二次创新,创新后的模型不仅在精度和速度上有了质的提升,还可以支持Stride为2的降采样。 改进方法简单高效,需要发论文的同学不要错过! 论文指导 PConv在论文中的描述 论文: 下面我们展示了可以通过利用特征图的冗余来进一步优化成本。如图3所…

JVM源码探秘:System.gc全面解析

概述 Java虚拟机&#xff08;JVM&#xff09;的垃圾回收&#xff08;GC&#xff09;通常由VM自身根据预设条件触发&#xff0c;但开发者也可通过特定手段人为触发&#xff0c;比如使用System.gc()、Runtime.gc()或JMap操作等。本文将深入探讨System.gc()的底层原理及其背后的故…

windows 在cmd 使用cd命令无法进入指定目录解决方法

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 使用cmd命令想要快速进入某个目录&#xff0c;发现没有跳转&#xff0c;如下&#xff1a; 二、原因分析 cmd 切换目录跨磁盘的话&#xff0c;需要先进行磁盘的转换&#xff0c;也就是要进入到另外一…

使用pkg打包了一个使用了sqlite3的nodejs项目,启动后闪退

从截图来看&#xff0c;问题出在 sqlite3 模块上。说明在打包过程中&#xff0c;sqlite3 模块的 .node 文件没有正确加载。 紧急解决方法&#xff1a; 其实就是exe文件还需要node_modules中的sqlite3 依赖&#xff0c;我们直接在系统顶级放一个node_modules&#xff0c;且其中只…

linux下 搭建Llama3

安装软件&#xff1a; Ollama&#xff0c;官方网站&#xff1a;https://ollama.com/ 可以再下载win、mac和linux版本 linux安装命令为&#xff1a;curl -fsSL https://ollama.com/install.sh | sh 由于我的机器是linux不联网机器&#xff0c;网上没找到下载离线方式&#xff0c…

嵌入式测试基础知识

1.白盒测试也称为结构测试&#xff0c;主要用于检测软件编码过程中的错误。 2.黑盒测试又称为功能测试&#xff0c;主要检测软件的每一个功能是否能够正常使用。 3.软件测试流程&#xff1a;根据测试需求编写测试计划、方案&#xff0c;测试用例&#xff0c;做测试分析&#…

极简朋友圈rmoments多用户版

什么是 moments &#xff1f; moments 是仿照微信朋友圈开发的个人极简朋友圈。但目前不支持多用户。 什么是 rmoments &#xff1f; rmoments 复刻自 moments&#xff0c;除了支持全部原生功能外&#xff0c;最大的特点是支持多用户。 原版 moments 目前不支持多用户。rmoment…

✅order by 是怎么实现的?

首先排序功能由 ORDER BY 实现&#xff0c;具体排列顺序取决于优化器的选择。若优化器认为索引排序更有效率&#xff0c;则使用索引排序&#xff1b;反之&#xff0c;则使用 filesort&#xff08;执行计划中额外信息提示&#xff1a;使用 filesort&#xff09;。然而&#xff0…

如何制定精益生产团队的目标和考核机制?

当下&#xff0c;精益生产已经成为企业追求高效运营和持续竞争优势的重要策略。而要实现精益生产的最大化效益&#xff0c;制定科学合理的团队目标与考核机制显得尤为重要。本文&#xff0c;深圳天行健企业管理咨询公司将分享如何制定精益生产团队的目标和考核机制&#xff0c;…

Java交换map的key和value值

在Java中&#xff0c;我们都知道直接交换Map的key和value是不被允许的&#xff0c;因为Map的接口设计是基于key-value对的&#xff0c;其中key是唯一的&#xff0c;并且是不可变的&#xff08;在HashMap等常见的实现中&#xff0c;虽然key的引用是不可变的&#xff0c;但key对象…

【Test 19】 数据结构 快速排序详解!

文章目录 1. 快速排序的非递归版本2. 快速排序2.1 hoare 版本一2.2 挖坑法 &#x1f427;版本二2.3 前后指针 版本三2.4 调用以上的三个版本的快排 3. 快速排序的优化 1. 快速排序的非递归版本 &#x1f192;&#x1f427;关键思路&#xff1a; &#x1f34e;① 参数中的begin…

vue3第三十六节(自定义插件)

一、首先什么是插件 插件 (Plugins) 是一种能为 Vue 添加全局功能的工具代码。 主要应用于以下四个方面 1、通过 app.component() 和 app.directive() 注册一到多个全局组件或自定义指令。 2、通过 app.provide() 使一个资源可被注入进整个应用。 3、向 app.config.globalPro…

【乐吾乐3D可视化组态编辑器】数据集与数据订阅

对于物联网或者数字孪生项目来说&#xff0c;单纯的静态场景展示是无法满足需求的&#xff0c;它需要系统可以提供一种方式将后台数据与模型数据关联&#xff0c;当后台数据推送更新时&#xff0c;模型数据能自动同步。接下来&#xff0c;我们将向您介绍如何在系统中实现这一需…