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

LeetCode - 3. 无重复字符的最长子串

目录

题目

解题思路:滑动窗口 + 哈希表

核心思想

详细实现步骤

图解示例

时间和空间复杂度

正确的写法


题目

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

解题思路:滑动窗口 + 哈希表

滑动窗口是处理子串/子数组问题的常用技巧,结合哈希表可以高效解决此问题。

核心思想

维护一个"窗口",这个窗口内的所有字符都是不重复的。当遇到重复字符时,调整窗口左边界,确保窗口内无重复字符。

详细实现步骤

  1. 初始化:
  • 创建哈希表记录字符出现次数
  • 左指针left和右指针right初始化为0
  • 最大长度ret初始化为0
  1. 扩展窗口:
  • 右指针right向右移动,将当前字符加入窗口
  • 更新哈希表中该字符的计数
  1. 处理重复:
  • 如果当前字符在窗口中已存在(计数>1)
  • 不断移动左指针left,同时减少对应字符的计数
  • 直到窗口中不再有重复字符
  1. 更新结果:
  • 每次调整窗口后,计算当前无重复子串的长度
  • 更新最大长度ret
  1. 继续扩展:
  • 右指针继续向右移动,重复步骤2-4

图解示例

以字符串 "abcabcbb" 为例:

初始状态:

字符串: a b c a b c b b↑l,r
哈希表: {}
最大长度: 0

步骤1:右指针移动到'a'

字符串: a b c a b c b b↑l r
哈希表: {a:1}
最大长度: 1

步骤2:右指针移动到'b'

字符串: a b c a b c b b↑ ↑l r
哈希表: {a:1, b:1}
最大长度: 2

步骤3:右指针移动到'c'

字符串: a b c a b c b b↑   ↑l   r
哈希表: {a:1, b:1, c:1}
最大长度: 3

步骤4:右指针移动到第二个'a'

字符串: a b c a b c b b↑     ↑l     r
哈希表: {a:2, b:1, c:1}

发现'a'重复,移动左指针直到窗口中'a'不重复:

字符串: a b c a b c b b↑   ↑l   r
哈希表: {a:1, b:0, c:0}
最大长度: 3

步骤5:右指针移动到第二个'b'

字符串: a b c a b c b b↑     ↑l     r
哈希表: {a:1, b:1, c:0}
最大长度: 3

 步骤6:右指针移动到第二个'c'

字符串: a b c a b c b b↑       ↑l       r
哈希表: {a:1, b:1, c:1}
最大长度: 3

 步骤7:右指针移动到第三个'b'

字符串: a b c a b c b b↑         ↑l         r
哈希表: {a:1, b:2, c:1}

'b'重复,移动左指针:

字符串: a b c a b c b b↑   ↑l   r
哈希表: {a:0, b:1, c:0}
最大长度: 3

步骤8:右指针移动到第四个'b'

字符串: a b c a b c b b↑     ↑l     r
哈希表: {a:0, b:2, c:0}

'b'重复,移动左指针:

字符串: a b c a b c b b↑ ↑l r
哈希表: {a:0, b:1, c:0}
最大长度: 3

最终结果:最大无重复子串长度为3

时间和空间复杂度

  • 时间复杂度:O(n),其中n是字符串长度。每个字符最多被访问两次(右指针遍历和左指针调整)。
  • 空间复杂度:O(min(m,n)),其中m是字符集大小,n是字符串长度。哈希表最多存储min(m,n)个字符。

正确的写法

class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_map<char,int> hash;  //这里可以使用数组代替哈希表可以提高效率int left=0;int right=0;int ret=0;while(right < s.size()){hash[s[right]]++;while(hash[s[right]]>1){hash[s[left++]]--;}right++;ret = max(ret,right-left);}return ret;}
};

相关文章:

  • 项目管理进阶:解析112页IPD集成产品开发高层培训【附全文阅读】
  • 十一、MySQL 事务底层与高可用原理
  • FDA方向图的matlab仿真实现
  • Linux【5】-----编译和烧写Linux系统镜像(RK3568)
  • 力扣HOT100之栈:394. 字符串解码
  • 【RAG排序】rag排序代码示例-高级版
  • 基于PHP的连锁酒店管理系统
  • 英国云服务器上安装宝塔面板(BT Panel)
  • cie数通的含金量高吗?费用多少?
  • MySQL--慢查询日志、日志分析工具mysqldumpslow
  • 由于 z(x,y) 的变化导致的影响(那部分被分给了链式项)
  • 动画直播如何颠覆传统?解析足球篮球赛事的数据可视化革命
  • 深度剖析OpenSSL心脏滴血漏洞与Struts2远程命令执行漏洞
  • ShuffleNet 改进:与通道注意力机制(CAM)的结合实现
  • python报错 ModuleNotFoundError: No module named ‘Crypto‘
  • SpringAI实战:ChatModel智能对话全解
  • [Linux] 命令行管理文件
  • Spring Boot 启动流程详解
  • 安装便捷、维护省心,强力巨彩租赁屏助力视觉体验升级
  • LeetCode - 647. 回文子串
  • 手把手教做网站/抖音seo什么意思
  • 老网站改版做别的/企业培训课程表
  • 网站开发微信端/如何让自己的网站快速被百度收录
  • 网站从哪些方面做优化/seo具体怎么优化
  • 网站后台内容编辑器/2023很有可能再次封城吗
  • 用php建网站/怎样在百度上推广