/*
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方法)
原文作者:KMP算法
原文地址: https://blog.csdn.net/z354681250/article/details/49078315
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/z354681250/article/details/49078315
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。