1. 子串问题概述
子串问题是算法面试中的高频考点,尤其在技术大厂的笔试面试中几乎必考。这类问题通常要求我们在一个主字符串或数组中,寻找满足特定条件的连续子序列。最常见的三类子串问题包括:求和为特定值的子数组、滑动窗口最大值以及最小覆盖子串。
在实际工程中,子串算法有着广泛的应用场景。比如在金融领域分析连续交易记录,在日志系统中查找特定模式的事件序列,或是在生物信息学中处理DNA序列匹配。掌握这些算法不仅能帮助通过技术面试,更能提升我们解决实际问题的能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 和为K的子数组问题解析
2.1 暴力枚举法实现
最直观的解法是使用双重循环枚举所有可能的子数组:
c复制int subarraySum(int* nums, int numsSize, int k) {
int count = 0;
for (int i = 0; i < numsSize; i++) {
int sum = 0;
for (int j = i; j < numsSize; j++) {
sum += nums[j];
if (sum == k) {
count++;
}
}
}
return count;
}
这种方法虽然简单直接,但时间复杂度为O(n²),当数组长度较大时(比如超过10⁴),性能会急剧下降。在实际面试中,面试官通常期望更优的解法。
注意:暴力解法在LeetCode上提交时,对于长度超过2×10⁴的测试用例会出现超时,这正说明了优化的重要性。
2.2 前缀和与哈希表优化
更高效的解法是利用前缀和配合哈希表,将时间复杂度优化到O(n)。其核心思想是:
- 计算到每个位置的前缀和
- 用哈希表记录每个前缀和出现的次数
- 查找满足pre[j] = pre[i] - k的前缀和出现次数
java复制class Solution {
public int subarraySum(int[] nums, int k) {
Map<Integer, Integer> prefixSumCount = ne
