1. 上海交大机试高频考点解析
作为计算机考研复试的重要环节,机试往往让不少同学感到头疼。根据历年真题分析,上海交通大学的机试题目主要集中在字符串处理、动态规划和图论算法三大领域。其中字符串匹配问题出现的频率最高,几乎每年必考。
我整理了过去5年的真题数据,发现字符串相关题目占比超过40%。比如2024年的"最长回文子串"、2023年的"字符串压缩"、2022年的"模式匹配"等。这些题目看似基础,但在时间限制和内存限制下,暴力解法很容易超时。
就拿字符串匹配来说,很多同学第一反应就是写双重循环的暴力匹配。这种写法在平时练习时可能没问题,但在机试环境下,面对10^6量级的字符串长度,O(n^2)的时间复杂度肯定无法通过。这就是为什么我们需要掌握更高效的算法。
2. KMP算法核心思想剖析
KMP算法之所以能高效解决字符串匹配问题,关键在于它利用了部分匹配信息。与暴力匹配每次失败后从头开始不同,KMP通过预处理模式串,构建next数组来记录"已匹配"的信息。
举个例子,假设我们要在文本串"abababab"中查找模式串"abab"。暴力匹配会在每次失配时将模式串右移一位重新比较,而KMP算法发现"abab"的前缀"ab"和后缀"ab"相同时,可以直接跳过中间不必要的比较。
next数组的构建是KMP的核心难点。它的每个元素表示模式串当前位置之前的子串中,最长相同前后缀的长度。比如模式串"abab"的next数组为[-1,0,0,1],这个预处理过程的时间复杂度是O(m)。
3. KMP算法优化实现
理解了原理后,我们来看具体实现。标准的KMP实现包括两个阶段:
void buildNext(const string &p, vector<int> &next) {
next[0] = -1;
int i = 0, j = -1;

&spm=1001.2101.3001.5002&articleId=155652092&d=1&t=3&u=dd4ed014ff7d4f648ff2a58e8d96cbb0)
950

被折叠的 条评论
为什么被折叠?



