[数据结构]字符串匹配(KMP方法)

来源:互联网 发布:米表源码 编辑:程序博客网 时间:2024/04/26 08:08
/*Name:字符串匹配(KMP方法)Actor:HTTime: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 2int 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];//如果往回找发现数值相同,直接返回那个数的nexti++; 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;}

0 0