leetcode刷题--lengthOfLongestSubstring

本文详细探讨了LeetCode中'lengthOfLongestSubstring'问题的解法,重点在于如何处理重复字符的滑动窗口。通过初始化字符索引、遍历字符串并维护一个没有重复字符的子串,当遇到重复字符时移动子串左边界,确保子串中不包含重复字符。此外,文章解释了为何在if条件中需要判断m[s[i]] < left,以确保正确计算最长子串长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题目主要难点在于这样一个问题:

a, b, c, d, e, f, c, g, h, ...

我从第一个字符开始检查,已经检查到f了,目前为止还没有出现重复字符:

[a, b, c, d, e, f,] c, g, h, ...

检查到下一个c时,发现它在前面已经出现过了(至于如何判断新字符是否已经出现过,我们在下面讨论):

[a, b,c, d, e, f,c,] g, h, ...

这时应该怎么办?下一次检查哪个子串?

这时将子串的右端点右移是错误的,因为这样子串中依然包括两个c:

[a, b,c, d, e, f,c, g,] h, ...

正确的方式是将子串左端点右移,使它不包含两个成重复的字符:

a, b,c, [d, e, f,c,] g, h, ...

然后再将右端点右移,继续检查:

a, b,c, [d, e, f,c, g,] h, ...

 

维持三个数:最长子串长度res,每个字符的下标索引m,左边界索引left,形成一个没有重复字符的滑动窗口。

首先初始化所有字符的索引为0,表示没有出现过,然后遍历string,依次给每个字符一个索引m,如果之前没有出现过,就直接计算res长度,如果出现重复字符,就移动左边界到之前这个重复字符位置索引的下一个字符索引,直到循环结束。

if条件语句中为啥要有个m[s[i]] < left,我们用一个例子来说明,当输入字符串为"abbca"的时候,当i=4时,也就是即将要开始遍历最后一个字母a时,此时哈希表中a对应1,b对应3,c对应4,left为2,即当前最长的子字符串的左边界为第二个b的位置,而第一个a已经不在当前最长的字符串的范围内了,那么对于i=4这个新进来的a,应该要加入结果中,而此时未被更新的哈希表中a为1,不是0,如果不判断它和left的关系的话,就无法更新res = i - left + 1这一句代码,那么答案就会少一位,所以需要加m[s[i]] < left。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值