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

11.无重复字符的最长子串

在这里插入图片描述

方法一:滑动窗口 + unordered_set

思路:用一个集合维护当前窗口([left, i])内的字符,当遇到重复时不断收缩左边界。

class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_set<char> lookup;int left = 0, maxLen = 0;for (int i = 0; i < (int)s.size(); ++i) {// 如果 s[i] 在窗口内已存在,就不断删掉 left 指向的字符并左移while (lookup.count(s[i])) {lookup.erase(s[left]);++left;}// 窗口此时合法,计算长度(包含 s[i])maxLen = max(maxLen, i - left + 1);// 将 s[i] 纳入窗口lookup.insert(s[i]);}return maxLen;}
};
  • 优点:逻辑直观,代码简单易懂。
  • 缺点while 循环中每次只移一个字符,在最坏情况下会执行较多次 erase

方法二:滑动窗口 + unordered_map 记录字符最新下标

思路:利用哈希表直接记录每个字符“上一次出现的位置”,当发现重复时,快速跳过整个区间,无需一个个删除。

class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_map<char, int> lastPos; // 记录字符上次出现的下标int maxLen = 0, left = 0;for (int i = 0; i < (int)s.size(); ++i) {char c = s[i];// 如果 c 在 [left, i-1] 范围内出现过,就把 left 直接跳到 上次出现位置 + 1if (lastPos.count(c) && lastPos[c] >= left) {left = lastPos[c] + 1;}// 更新 c 的最新下标lastPos[c] = i;// 计算当前窗口长度maxLen = max(maxLen, i - left + 1);}return maxLen;}
};
  • 优点:每个字符只处理一次,left 跳动效率更高;
  • 缺点:需要额外存储每个字符的下标(空间 O(k)),不过字符集一般较小。

相关文章:

  • 电路图识图基础知识-电动机制动控制电路(十八)
  • Java 8 Stream API 入门到实践详解
  • 人工智能赋能高中学科教学的应用与前景研究
  • 【Qt】背景知识 + 环境搭建
  • Xilinx FPGA MIPI DSI TX Subsystem 仿真笔记
  • 【Langchain】构建RAG基本流程
  • QT使用AES加解密,openssl及QCA问题记录
  • 综合笔试知识点
  • 文字转语音
  • 关于汉语普通话元音音位最好归纳为几个的问题
  • 能上Nature封面的idea!强化学习+卡尔曼滤波
  • 【Electron】应用打包教程(包含 C++ 后端 + 前端)
  • Spring AI与Spring Modulith核心技术解析
  • springboot的test模块使用Autowired注入失败
  • 【Linux】Linux进程间通讯-共享内存
  • FSMC扩展外部SRAM
  • Linux Gnome壁纸
  • 言思集交流社区(SpringBoot)
  • Linux中su与sudo命令的区别:权限管理的关键差异解析
  • CMake基础:构建流程详解
  • 网站费用标准/找百度
  • 领卷网站怎么做的/搜索引擎优化
  • 武汉网页平面设计/网站推广与优化平台
  • 西樵网站建设公司/电脑培训机构
  • 网站搭建公司排行榜/站内推广有哪些方式
  • 建湖哪家专业做网站/无锡今日头条新闻