KMP算法
Next数组求解
对于字符串“abababca”,它的next如下表所示:
void get_next(SString T, int* next) {
int i = 1, j = 0;
next[1] = 0; // next[1]的值总是0
while (i < T.length) {
if (j == 0 || T.ch[i] == T.ch[j]) { // 如果j处于0位或者,俩字符相等
++i; ++j; // 继续比较后继字符
next[i] = j; // 当前的j就是next的值
} else {
j = next[j]; // 若字符不相等,则j利用next[j]进行回溯
}
}
}
考试手算:前缀后缀匹配
算法简单的语言描述一下:
- 当我们在做KMP算法时,会设置两个指针,i和j。i初始值位1,j初始值位0。
- 在KMP算法中,i在算法过程中不会减小且next[1] = 0。
- 当j = 0 或者 两个比较的字符相同时,跳过,++i,++j,且此时next[i]的值恰好为j。
- 当两个字符不同时,i不发生变化,j回溯到next[j]的位置。
Nextval数组求解
对于字符串“ababaa”,它的next如下表所示:
void get_nextval(SString T, int nextval[]) {
int i = 1, j = 0;
nextval[1] = 0;
while(i < T.length) {
if(j==0 || T.ch[i] == T.ch[j]) {
++i; ++j;
if (T.ch[i] != T.ch[j]) nextval[i] = j;
else nextval[i] = nextval[j];
}
else {
j = nextval[j];
}
}
}
nextval数组解决了,j回溯之后仍然字符不相等的漏洞
考试手算:先求next数组,再求nextval数组
算法简单理解:其实就多了一个检查是否回溯之后仍然无效
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具