您的位置:首页 > 其它

字符串匹配(普通+KMP)

2014-06-04 20:38 344 查看
普通的字符串匹配函数:
// 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;
}
所有代码已经调试通过!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息