当前位置: 首页 > 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)),不过字符集一般较小。

http://www.xdnf.cn/news/929485.html

相关文章:

  • LUFFY(路飞): 使用DeepSeek指导Qwen强化学习
  • 34 C 语言字符串转数值函数详解:strtol、strtoll、strtoul、strtoull(含 errno 处理、ERANGE 错误)
  • 创建一个纯直线组成的字体库
  • 【强连通分量 缩点 最长路 拓扑排序】P2656 采蘑菇|普及+
  • Linux 文本三剑客(grep, awk, sed)
  • 运维_集运维核心学习
  • xctf-weak_auth(弱口令)
  • 【C++ 真题】P1747 好奇怪的游戏
  • 23、字节对齐
  • 22、模板特例化
  • WPF 播放器(AudioPlayer 2025)
  • triton学习笔记6: Fused Attention
  • CAN转PROFINET网关设备基本功能介绍
  • Android资源ID冲突解决方案
  • 28、元组的遍历
  • Redis :String类型
  • 第23讲、Odoo18 邮件系统整体架构
  • AIGC行业发展演进:从技术萌芽到智能革命
  • 全面解析:tzst 归档格式的先进性与跨平台文件管理指南
  • RTOS学习之重难点
  • go语言学习 第8章:切片
  • CMake检测C编译器标志功能
  • 基于51单片机的24小时倒计时仿真
  • CAN转PROFINET协议网关之PROFINET转CANfree组态秘诀
  • 10.接雨水
  • 九、【ESP32开发全栈指南: UDP通信服务端】
  • Redis 持久化机制深度解析
  • 反向传播的核心是什么:计算损失函数对可训练参数的梯度=== 损失函数能通过计算图连接到可训练参数
  • 打印高质量日志的10条军规
  • FPGA 可重构技术的实现方法