KMP算法
学习时间2022.12.11
KMP算法
基本概念
- 关于如何理解KMP算法的过程,这篇文章讲解地十分详细The Knuth-Morris-Pratt Algorithm in my own words
- 看完后,我大概理解了怎么求next数组,但是对后面实际执行的过程不太熟悉,没有完全理解
代码实现
暴力匹配算法
typedef char* SString;
//暴力匹配
int Index(SString S, SString T) {
int i = 1, j = 1;
while (i<=S[0]&&j<=T[0])
{
if (S[i] == T[j])
{
i++;
j++;
}
else
{
i = i - j + 2;
j = 1;
}
}
if (j > T[0])
{
return i - T[0];
}
else
{
return 0;
}
}
KMP算法
求next数组
//计算next数组
void Get_next(SString T, int next[]) {
int i = 1;
next[1] = 0;
int j = 0;
while (i < T[0])
{
if (j == 0 || T[i] == T[j])
{
++i;
++j;
next[i] = j;//记录出现重复的位置
}
else
{
j = next[j];
}
}
}
KMP
//KMP算法
int KMP(SString S, SString T, int next[]) {
int i = 1, j = 1;
while (i <= S[0] && j <= T[0])
{
if (j == 0 || S[i] == T[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
if (j > T[0])
{
return i - T[0];
}
else
{
return 0;
}
}
main函数
int main() {
//主串
char S[256];
//模式串
char T[10];
//next数组
int next[10];
int pos;
S[0] = strlen("abcabaaabacbabc");
strcpy(S + 1, "abcabaaabacbabc");
T[0] = strlen("abacba");
strcpy(T + 1, "abacba");
pos = Index(S, T);
printf("暴力匹配的结果:%d\n", pos);
Get_next(T, next);
for (int i = 1; i <= T[0];i++) {
printf("%3d", next[i]);
}
printf("\n");
pos = KMP(S, T, next);
printf("KMP算法匹配的结果:%d\n", pos);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!