[数据结构]字符串匹配(KMP方法)
Posted z354681250
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[数据结构]字符串匹配(KMP方法)相关的知识,希望对你有一定的参考价值。
/*
Name:字符串匹配(KMP方法)
Actor:HT
Time:2015年10月12日
Error Reporte:
*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define N 10010
//只走一遍原串
//每次不匹配,将子串往回移动到一定位置
//移动的位置是提前根据“循环节”计算得出
//O(m+n)
int next[30];
void fin_next(char * ncomer) //改版
// 0 1 2 3 4 5 6 7
// a a a a d a a d
//通过i和j进行匹配 从而判断当(i+1)失败的情况要走的j
//并且往回找的时候 直接跳过数值相同的情况
// - - - - 3 - - 2
//j- 0 1 2 3 0 1 2
int i, j;
next[0] = -1;
for (i = 0, j = -1; ncomer[i] != '\\0';)
if (j == -1 || ncomer[i] == ncomer[j])
if (ncomer[i + 1] != ncomer[j + 1]) next[i + 1] = j + 1;
else next[i + 1] = next[j + 1]; //如果往回找发现数值相同,直接返回那个数的next
i++; j++;
else j = next[j];
//void fin_next(char * ncomer) //原版
//
// // 0 1 2 3 4 5 6 7
// // a a a a d a a d
// // - 0 1 2 3 0 1 2
// //通过i和j进行匹配,从而判断当(i+1)失败的情况要走的j
// int i, j;
// next[0] = -1;
// for (i = 0, j = -1; ncomer[i] != '\\0';)
//
// if (j == -1 || ncomer[i] == ncomer[j])
//
// next[i + 1] = j + 1; //i和j匹配成功,那么i+1的next就是j+1
// i++; j++;
//
// else j = next[j];
//
//
int charcmp(char* ori, char* ncm)
int i,j;
for (i = 0, j = 0; ori[i] != '\\0';) //BUG点,注意不要将ncm[j] !='\\0'放进去,会过早结束循环
if (j == -1 || ori[i] == ncm[j])
i++; j++;
else j = next[j];
if(j != -1 && ncm[j] == '\\0') break;
if (ncm[j] == '\\0') return i-j;
else return NULL;
int main()
int i, j;
char ori[30], ncomer[30];
while (scanf("%s", ori) != EOF)
scanf("%s", ncomer);
fin_next(ncomer);
int ans = charcmp(ori, ncomer);
printf("%s\\n", &ori[ans]);
system("pause");
return 0;
以上是关于[数据结构]字符串匹配(KMP方法)的主要内容,如果未能解决你的问题,请参考以下文章