1. 项目概述
今天要分享的是LeetCode经典题目中的两道中等难度题——"无重复字符的最长子串"和"赎金信"。这两道题分别考察了滑动窗口和计数数组这两个算法技巧,在实际面试中出现频率极高。作为刷过300+题的过来人,我发现很多同学容易在这类问题上陷入暴力解法的误区,今天就用最直白的语言拆解这两道题的优化思路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 无重复字符的最长子串
2.1 问题描述
给定一个字符串s,找出其中不含有重复字符的最长子串的长度。例如:
- 输入:"abcabcbb" → 输出:3("abc")
- 输入:"bbbbb" → 输出:1("b")
2.2 暴力解法分析
最直观的做法是双重循环检查所有子串:
python复制def lengthOfLongestSubstring(s):
max_len = 0
for i in range(len(s)):
for j in range(i, len(s)):
if len(set(s[i:j+1])) == j-i+1:
max_len = max(max_len, j-i+1)
return max_len
时间复杂度O(n³),在LeetCode上会直接超时。
2.3 滑动窗口优化
更聪明的做法是维护一个滑动窗口:
python复制def lengthOfLongestSubstring(s):
char_index = {} # 记录字符最后出现位置
left = max_len = 0
for right, char in enumerate(s):
if char in char_index and char_index[char] >= left:
left = char_index[char] + 1
char_index[char] = right
max_len = max(max_len, right - left + 1)
return max_len
关键点:
- 用字典记录字符最后出现位置
- 当遇到重复字符时,快
