返回
突破编程瓶颈,巧解 LeetCode 无重复字符最长子串
后端
2023-10-02 19:06:25
引言
算法问题是程序员进阶的必经之路,而 LeetCode 是磨练算法技能的绝佳平台。今天,我们聚焦于 LeetCode 第 3 题:无重复字符的最长子串。这道中等难度题目考验着你的字符串处理能力和算法思维。通过剖析巧妙的解题思路,我们将带你领略算法的魅力,提升你的编程水平。
题目
给定一个字符串 s,找出不包含重复字符的最长子串的长度。
解题思路
这道题的本质是寻找字符串中连续且不包含重复字符的最长片段。我们可以使用滑动窗口算法来解决这个问题:
- 初始化滑动窗口: 使用两个指针,
left
和right
,定义一个滑动窗口。一开始,将这两个指针都指向字符串的开头。 - 滑动窗口: 循环滑动窗口,将
right
指针向右移动,直到遇到重复字符。当遇到重复字符时,将left
指针移动到重复字符的下一个位置。 - 记录最长子串: 在每次滑动窗口的过程中,记录当前窗口的长度,并更新最长子串的长度。
代码示例
def length_of_longest_substring(s):
"""
返回字符串 s 中无重复字符的最长子串的长度。
:param s: 给定的字符串
:return: 最长子串的长度
"""
left, right, max_length = 0, 0, 0
char_index = {} # 存储字符上次出现的位置
while right < len(s):
if s[right] in char_index and char_index[s[right]] >= left:
# 如果当前字符在滑动窗口内出现过,更新 left 指针
left = char_index[s[right]] + 1
char_index[s[right]] = right # 更新字符的最新出现位置
max_length = max(max_length, right - left + 1) # 更新最长子串长度
right += 1 # 右指针右移
return max_length
示例
输入:s = "abcabcbb"
输出:3 # 最长子串为 "abc"
输入:s = "bbbbb"
输出:1 # 最长子串为 "b"
输入:s = "pwwkew"
输出:3 # 最长子串为 "wke"
拓展
除了滑动窗口算法,还有其他解决方法,如哈希表法和 Manacher 算法。你可以探索不同的解法,加深对算法的理解。此外,尝试将这个算法应用于实际场景中,例如文本压缩或模式匹配。
总结
通过学习 LeetCode 第 3 题:无重复字符的最长子串,我们掌握了一种巧妙的算法技巧——滑动窗口算法。算法题的解决不仅仅在于代码实现,更在于思维训练和逻辑推理。通过不断练习,相信你的算法能力和编程水平将得到显著提升。