LeetCode 热题 HOT 100(02,无重复字符的最长子串)

LeetCode 热题 HOT 100(02,无重复字符的最长子串)
不够优秀,发量尚多,千锤百炼,方可成佛。
算法的重要性不言而喻,无论你是研究者,还是最近比较火热的IT 打工人,都理应需要一定的算法能力,这也是面试的必备环节,算法功底的展示往往能让面试官眼前一亮,这也是在大多数竞争者中脱颖而出的重要影响因素。
然而往往大多数人比较注重自身的实操能力,着重于对功能的实现,却忽视了对算法能力的提高。有的时候采用不同的算法来解决同一个问题,运行效率相差还是挺大的,毕竟我们最终还是需要站在客户的角度思考问题嘛,能给用户带来更加极致的体验当然再好不过了。
万法皆空,因果不空。Taoye之前也不怎么情愿花费太多的时间放在算法上,算法功底也是相当的薄弱。这不,进入到了一个新的学习阶段,面对导师的各种“严刑拷打”和与身边人的对比,才开始意识到自己“菜”的事实。
讲到这,我的眼角又湿了!!!
这次的题目是LeeTCode 热题 HOT 100的第三题,难度属于中等,感觉比第二题稍微简单点。
下面,我们就来看看这道题吧。
题目:无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
题目Url:https://leetcode.com/problems/longest-substring-without-repeating-characters/
示例
- 示例1
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
- 示例2
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
- 示例3
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路
根据题目的要求,我们需要输出无重复字符的最长子串长度,我们不妨用result
来代替。
由于需要记录输入字符串的每个字符在之前遍历的子串中是否重复,所以我们需要一个容器对已经遍历过的字符进行临时存储。
进过分析,我们可以发现,临时容器存储的数据主要有两个,一个是字符值,还有一个就是字符在输入字符串中的索引值,且这两个属性有个一一映射关系。所以我们不难得到,可以通过创建一个HashTable来代替该容器,在Python中,则可以使用dict字典来表示。(与HOT 100第一题意思类似)我们不妨将该临时字典容器用temp_dict
来表示。
此外,在对输入字符串进行遍历的过程中,还需要用到一个临时索引,主要用来记录与遍历当前字符值相同的上一个字符的索引,比如:示例1中输入字符串为“abcabcbb”,当我们遍历到索引为3的时候,此时字符为a,而上一个字符a的索引为0。所以,当我们遍历到的字符在temp_dict中出现过时,则需要更改与该字符相同的上一个字符的索引,也就是由初始值-1更改为0。我们不妨将这个临时索引用temp_index
来表示
至此,我们得到的完整算法如下(推敲算法流程和下面代码的实现):
- 初始化三个变量:
result, temp_dict, temp_index = 0, dict(), -1
,目标返回值result和temp_dict初始为0和dict()不用解释,而temp_index之所以初始为-1,主要是因为我们返回新的result的时候,需要与之前的result和遍历至此时候的最大长度进行比较,取二者的最大值。 - 对输入的字符串进行遍历,判断如果当前遍历字符在
temp_dict
中,且该字符上次出现的索引大于当前更新前的temp_index临时索引,则需要更新临时索引temp_index
和临时字典temp_dict
。否则将首次出现的字符添加到临时字典temp_index
中,并更新result的值。 - 遍历完输入的字符串之后,返回result
该算法的Python实现:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
result, temp_dict, temp_index = 0, dict(), -1 # 定义初始变量
for index, value in enumerate(s): # 对输入字符串s进行循环遍历
if value in temp_dict and temp_dict[value] > temp_index: # 判断temp_dict是更新还是添加
temp_index, temp_dict[value] = temp_dict[value], index # 更新temp_dcit和temp_index
# 添加temp_dict,并修改result
else: temp_dict[value], result = index, max(result, index - temp_index)
return result # 遍历完成返回目标结果
该算法的C++实现(实现思想同Python):
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int result = 0, temp_index = -1;
unordered_map<char, int> temp_dict;
for (int index = 0; index < s.size(); index++) {
if (temp_dict.count(s[index]) != 0) {
if (temp_dict[s[index]] > temp_index) {
temp_index = temp_dict[s[index]];
temp_dict[s[index]] = index;
}
}else {
temp_dict[s[index]] = index;
result = result > (index - temp_index) ? result : (index - temp_index);
}
}
return result;
}
};
另外,官方给出了一种滑动窗口的方式实现,主要是找出从每一个字符开始,不包含重复字符的最长子串。
滑动窗口的主要核心思想可以参考官方,或者下面三篇讲解的思路,感觉讲的很不错:
- 《LeetCode第三题:解题思路》: https://blog.csdn.net/boling_cavalry/article/details/86563586
- 《LeetCode第三题:编码实现》:https://blog.csdn.net/boling_cavalry/article/details/86654969
- 《LeetCode第三题:两次优化》:https://blog.csdn.net/boling_cavalry/article/details/86655675
推荐阅读:
LeetCode 热题 HOT 100(00,两数之和)
LeetCode 热题 HOT 100(01,两数相加)
Taoye渗透到一家黑平台总部,背后的真相细思极恐
《大话数据库》-SQL语句执行时,底层究竟做了什么小动作?
那些年,我们玩过的Git,真香
基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境
网络爬虫之页面花式解析
手握手带你了解Docker容器技术
一文详解Hexo+Github小白建站
打开ElasticSearch、kibana、logstash的正确方式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人