字符串匹配KMP算法初探

来源:互联网 发布:java ssh2 linux交互 编辑:程序博客网 时间:2024/06/11 12:00

先来看基本的串的匹配算法。

给定一父串和一子串,判断子串是否匹配父串,匹配则返回父串开始匹配处的坐标,不匹配则返回-1.可配合下面的过程图看代码:

#include <stdio.h>#include <string.h>int Index(char s[], char t[], int pos)//s存放父串,t放子串。{int i,j,slen,tlen;//i,j代表游标,分别指向父串和子串i = pos;//父串从pos位置开始j = 0;slen = strlen(s);tlen = strlen(t);while( i<slen && j<tlen){if( s[i]==t[j] ){i++;j++;}else{i = i-j+1;//不能写成i=1是因为pos不一定从0开始j = 0;}}if( j >= tlen)return i-tlen;//返回父串匹配子串开始点的下标else return -1;//没有匹配则返回-1}int main(){char s[]="goodgoogle";char t[]="google";int index = Index(s,t,0);printf("%d\n",index);//应该返回4return 0;}

KMP算法:

参考:http://blog.sina.com.cn/s/blog_67947d740100nwwl.html

#include <stdio.h>#include <string.h>void GetNext(char t[],int next[]){int i, j, tlen;tlen = strlen(t);i = 0;j = -1;next[0] = -1;while(i < tlen){if((j == -1) || (t[i] == t[j])){i++;j++;next[i] = j;}else{j = next[j];}}}int Index(char s[], char t[], int pos)//s存放父串,t放子串。{int next[255];int i,j,slen,tlen;//i,j代表游标,分别指向父串和子串i = pos;//父串从pos位置开始j = -1;slen = strlen(s);tlen = strlen(t);GetNext(t,next);while( i<slen && j<tlen){if( j==-1 || s[i]==t[j] ){i++;j++;}else{j = next[j];}}if( j >= tlen)return i-tlen;//返回父串匹配子串开始点的下标else return -1;//没有匹配则返回-1}int main(){int index;char s[]="goodgoogle";char t[]="ababaaaba";index = Index(s,t,0);printf("%d\n",index);//应该返回4return 0;}