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

无重复字符的最长子串,leetCode热题100,C++实现

题目来源:leetCode

3. 无重复字符的最长子串 - 力扣(LeetCode)

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

解法

class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_set<char> charSet;  // 存储当前窗口内的字符int left = 0;                 // 窗口左边界int maxLength = 0;            // 记录最大长度// 右指针遍历整个字符串for (int right = 0; right < s.size(); right++) {// 当发现重复字符且窗口大小至少为2时,收缩左边界while (left < right && charSet.count(s[right]) > 0) {charSet.erase(s[left]);  // 移除左边界字符left++;                  // 左指针右移}// 将当前字符加入窗口charSet.insert(s[right]);// 更新最大长度maxLength = max(maxLength, right - left + 1);}return maxLength;}
};

采用滑动窗口法,我们有一个left和一个right指针,表示窗口的两个边界,我们不断的移动right指针,当遇到重复元素时,开始移动left指针,直到left指针移动到重复元素的下一个位置为止

比如abcdaeft,其实left和right都指向a,然后right不断移动,当right指向第二个a时,开始移动left,left会指向b,此时就没有重复元素了

left < right && charSet.count(s[right]) > 0

核心代码是这一块,left<right可以保证窗口大小至少为2,如果left==right,则窗口只有一个字符,不重复,也不会进入while循环

count可以看做是find,会返回元素出现的次数,也就是有重复时才会进入while循环

http://www.dtcms.com/a/361684.html

相关文章:

  • 【FireCrawl】:本地部署AI爬虫+DIFY集成+V2新特性
  • FFmpeg 不同编码的压缩命令详解
  • 速卖通自养号测评系统开发指南:环境隔离与行为模拟实战
  • 测试-用例篇
  • FFMPEG AAC
  • 【LeetCode每日一题】19. 删除链表的倒数第 N 个结点 24. 两两交换链表中的节点
  • Java内存模型下的高性能锁优化与无锁编程实践指南
  • 几种特殊的数字滤波器---原理及设计
  • 【零碎小知识点 】(四) Java多线程编程深入与实践
  • MongoDB主从切换实战:如何让指定从库“精准”升级为主库?保姆级教程!
  • 36. Ansible变量+管理机密
  • 【Android】使用Handler做多个线程之间的通信
  • Java面试宝典:Redis高并发高可用(集群)
  • 函数,数组与正则表达式
  • Kafka 架构原理
  • 销售事业十年规划,并附上一套能帮助销售成长的「软件工具组合」
  • 【git 基础】detached HEAD state的出现和解决
  • C++11模板优化大揭秘:让你的代码更简洁、更安全、更高效
  • javaScript变量命名规则
  • 【汇客项目】:在启动过程中报错 本来安装的是node-sass 被卸载后安装的sass ,代码中一部分出现问题
  • 【深度学习基础】深度学习中的数据增强技术:从理论到实践的解析
  • 【ARMv7】开篇:掌握ARMv7架构Soc开发技能
  • Deepoc具身智能运动控制板:赋能机器感知与决策
  • (MySQL)分布式锁
  • CCNP考试通过后多久有证书,哪里可以查询下载电子证书。
  • 重新理解图神经网络训练:数据、Batch、权重与大图
  • 深入理解零拷贝:本地IO与网络IO的性能优化利器
  • wpf之StackPanel
  • 一、Git与Gitee常见问题解答
  • 2025年数字化转型关键证书分析与选择指南