1. 尺取法核心思想解析
尺取法(Two Pointers Technique)是一种通过维护两个指针来高效遍历序列的算法策略。这个形象的名称来源于其工作方式——就像用一把可伸缩的尺子在序列上滑动测量。我在处理字符串匹配和子数组问题时,发现这种方法能大幅降低时间复杂度。
1.1 基本工作原理
想象你在检查一列排队的人是否符合身高要求。传统做法是从头到尾逐个检查每个人及其后续组合(O(n²)复杂度)。而尺取法让你同时移动队伍的首尾检查点:
- 初始化左右指针(left=0, right=0)
- 右指针向前扩展窗口,直到满足条件
- 左指针向前收缩窗口,优化解的范围
- 重复上述过程直到遍历完成
这种策略将许多问题的复杂度从O(n²)降到了O(n),特别是在处理连续子序列问题时效果显著。
1.2 适用场景特征
根据我的项目经验,符合以下特征的问题适合尺取法:
- 需要处理数组/字符串的连续子序列
- 问题可以转化为"满足某条件的最短/最长区间"
- 当右指针右移时,条件单调变化(更容易维护窗口状态)
典型应用包括:最小覆盖子串、无重复字符的最长子串、区间求和等问题。接下来我会用实际案例展示如何实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 经典问题实战:最小覆盖子串
让我们以LeetCode 76题为例,演示尺取法的完整实现过程。题目要求:在字符串s中找到涵盖字符串t所有字符的最短子串。
2.1 预处理与初始化
python复制from collections import defaultdict
def minWindow(s: str, t: str) -> str:
# 初始化哈希表记录需要匹配的字符频次
need = defaultdict(int)
for c in t:
need[c] += 1
need_cnt = len(t) # 需要匹配的字符总数
left = 0 # 窗口左边界
res = (0, float('inf')) # 结果存储(start, length)
这里使用defaultdict记录目标字符串t的字符分布,need_cnt变量动态跟踪还需匹配的字符数。这种预处理是尺取法的关键准备步骤。
