普通的字符串匹配函数:
// KMP.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
//求字串位置的定位函数
char *s="acabaabaabcacaabc";
char *p="abaabcac";
int lenS;
int lenP;
int Index(char *s,char *p,int pos){
int i=pos;
int j=0;
while(i<lenS&&j<lenP){
if(s[i]==p[j])
{
i++;
j++;
}
else
{
i=i-j+1;j=0;
}
}
if(j=lenP) return i-lenP;
else
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
lenS=strlen(s);//目标串长度
lenP=strlen(p);//字串长度
int index=Index(s,p,0);
printf("%d\n",index);
return 0;
}
基本思想:如果匹配成功,则目标串和字串同时向后移动一位,否则,目标串从当前位置向后移动一位,字串则移动到开始位置进行重新匹配。
KMP算法:
其中比较重要的过程就是计算next函数
参考文献:http://www.cnblogs.com/zhizhizhiyuan/p/3508052.html
// KMP.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
//求字串位置的定位函数
char *s="acabaabaabcacaabc";
char *p="abaabcac";
int lenS;
int lenP;
int Index(char *s,char *p,int pos){
int i=pos;
int j=0;
while(i<lenS&&j<lenP){
if(s[i]==p[j])
{
i++;
j++;
}
else
{
i=i-j+1;j=0;
}
}
if(j=lenP) return i-lenP;
else
return 0;
}
int *next;
//计算前缀函数
void getNext(char *p,int * &next){
int i=0;
next[0]=-1;
int j=-1;
while(p[i]!='\0'){
if(j==-1||p[i]==p[j])
{
i++;
j++;
if(p[i]!=p[j])
next[i]=j;
else
next[i]=next[j];
}
else
j=next[j];
}
}
//使用kmp的编程实现
int Index_KMP(char *s,char *p,int pos){
int i=pos;
int j=0;
while(i<lenS&&j<lenP)
{
if(j==0||s[i]==p[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j==lenP)
return i-lenP;
else
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
lenS=strlen(s);//目标串长度
lenP=strlen(p);//字串长度
//int index=Index(s,p,0);
next=(int *)malloc(sizeof(int)*lenP);
getNext(p,next);
//for(int i=0;i<lenP;i++)
// printf("%d ",next[i]);
int index=Index_KMP(s,p,0);
printf("%d\n",index);
return 0;
}
所有代码已经调试通过!
转载于:https://blog.51cto.com/4989715/1422226