返回
在LeetCode 3中用打卡算法找寻不重复字符的字符串长度
前端
2024-01-23 14:25:10
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。
题目
LeetCode 3 题目如下:
给你一个字符串 s,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入:s = "abcabcbb"
输出:3
解释:因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入:s = "bbbbb"
输出:1
解释:因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入:s = "pwwkew"
输出:3
解释:因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意:
- s 仅由英文字母组成。
- s 的长度在 [0, 5 * 10^4] 范围内。
打卡算法
打卡算法是一种高效的算法,用于查找字符串中最长不重复字符子串的长度。该算法的基本思想是:
- 设置一个哈希表来存储每个字符及其最近出现的位置。
- 从字符串的开头开始,依次检查每个字符:
- 如果字符不在哈希表中,则将其添加到哈希表中,并更新当前无重复字符子串的长度。
- 如果字符在哈希表中,则计算从当前字符到哈希表中该字符最近出现位置之间的长度,更新当前无重复字符子串的长度,并将哈希表中该字符的最近出现位置更新为当前位置。
算法步骤
以下是以打卡算法求解LeetCode 3的方法:
- 设置一个哈希表来存储每个字符及其最近出现的位置。
- 设置一个变量
max_length
来存储当前无重复字符子串的长度,初始值为0。 - 设置一个变量
start
来存储当前无重复字符子串的起始位置,初始值为0。 - 遍历字符串
s
中的每个字符c
:- 如果
c
不在哈希表中,则将其添加到哈希表中,并更新max_length
为max(max_length, i - start + 1)
。 - 如果
c
在哈希表中,则计算从c
到哈希表中c
最近出现位置之间的长度length
,更新max_length
为max(max_length, length)
,并将哈希表中c
的最近出现位置更新为i
。
- 如果
- 返回
max_length
。
示例代码
def length_of_longest_substring(s):
"""
:type s: str
:rtype: int
"""
# 设置哈希表
char_index_map = {}
# 设置无重复字符子串的长度
max_length = 0
# 设置无重复字符子串的起始位置
start = 0
# 遍历字符串
for i, c in enumerate(s):
# 如果字符不在哈希表中,则将其添加到哈希表中
if c not in char_index_map:
char_index_map[c] = i
# 更新无重复字符子串的长度
max_length = max(max_length, i - start + 1)
# 如果字符在哈希表中,则计算长度并更新哈希表
else:
# 计算从当前字符到哈希表中该字符最近出现位置之间的长度
length = i - char_index_map[c]
# 更新无重复字符子串的长度
max_length = max(max_length, length)
# 更新哈希表中该字符的最近出现位置
char_index_map[c] = i
# 返回无重复字符子串的长度
return max_length
# 测试代码
s = "abcabcbb"
result = length_of_longest_substring(s)
print(result) # 输出:3
总结
本文介绍了打卡算法,并演示了如何使用打卡算法求解LeetCode 3。打卡算法是一种高效的算法,可以用于解决字符串中无重复字符的最长子串问题。该算法的基本思想是使用哈希表来存储每个字符及其最近出现的位置,然后依次检查字符串中的每个字符,如果字符不在哈希表中,则将其添加到哈希表中并更新当前无重复字符子串的长度;如果字符在哈希表中,则计算从当前字符到哈希表中该字符最近出现位置之间的长度,更新当前无重复字符子串的长度,并将哈希表中该字符的最近出现位置更新为当前位置。