1. 项目概述
今天要分享的是LeetCode上两道经典题目:"无重复字符的最长子串"和"赎金信"。这两道题分别来自LeetCode热题100和日常练习题库,是面试中经常被问到的题目类型。作为算法练习者,掌握这两道题的解法不仅能提升编程能力,更能深入理解滑动窗口和计数数组这两个重要算法技巧。
我在刷题过程中发现,很多初学者对这两道题的理解往往停留在表面,只是机械记忆解法而不知其所以然。本文将带大家从问题本质出发,通过详细的原理解析和多种解法对比,真正掌握这两类问题的解决思路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 无重复字符的最长子串解析
2.1 问题描述与示例
题目要求给定一个字符串s,找出其中不含有重复字符的最长子串的长度。例如:
- 输入:"abcabcbb",输出:3("abc")
- 输入:"bbbbb",输出:1("b")
- 输入:"pwwkew",输出:3("wke")
这道题的关键在于"无重复字符"和"最长子串"两个条件。子串必须是连续的,且所有字符都不重复。
2.2 暴力解法分析
最直观的解法是暴力枚举所有可能的子串,然后检查是否有重复字符。这种方法时间复杂度为O(n^3),显然效率太低,无法通过LeetCode的测试用例。
python复制def lengthOfLongestSubstring(s: str) -> int:
n = len(s)
res = 0
for i in range(n):
for j in range(i, n):
if len(set(s[i:j+1])) == j - i + 1:
res = max(res, j - i + 1)
return res
2.3 滑动窗口优化
滑动窗口是解决这类子串问题的经典方法。其核心思想是维护一个窗口,通过调整窗口的左右边界来寻找符合条件的子串。
具体实现步骤:
- 使用哈希集合记录当前窗口中的字符
- 初始化左右指针left和right都指向字符串开头
- 右指针不断右移,将新字符加入集合
- 当遇到重复字符时,左指针右移直到消除重复
- 在整个过程中记录窗口的最大长度
python复制def lengthOfLo
