// exam1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
using namespace std;
void get_next(int* &next,char* s)
{
int j=0;
int i=1;
int len=strlen(s);
next=(int*)malloc(len*sizeof(int));
memset(next,len*sizeof(int));
while(s[i]!='\0')
{
if(s[j]==s[i])
{
i++;
j++;
if(s[i]!=s[j])
{
next[i]=j;
}
else
{
next[i]=next[j];
}
}
else
{
if(j==0)
{
i++;
}
j=next[j];
}
}
}
int kmp(int* next,char* s,char* m)
{
int i=0,j=0;
while(s[i]!='\0')
{
if(m[j]=='\0')
{
break;
}
if(s[i]==m[j])
{
i++;
j++;
}
else
{
if(j==0)
{
i++;
}
j=next[j];
}
}
return i-strlen(m);
}
int main(void)
{
int len,*next;
char *s="acabaabaabcacaabc";
char *m="abaabcac";
len=strlen(m);
get_next(next,m);
int loc=kmp(next,s,m);
/*for(int i=0;i
{
cout<
}*/
cout<
system("pause");
return 0;
}
code2
#include "stdafx.h"
#include
#include
#include
using namespace std;
void getNext(char* s,int* &next)
{
next=new int[strlen(s)];
memset(next,strlen(s)*sizeof(int));
int i=0;
int j=-1;
next[0]=-1;
while(i
{
if(j==-1 || s[i]==s[j])
{
i++;
j++;
if(s[i]==s[j])
{
next[i]=next[j];
}
else
{
next[i]=j;
}
}
else
{
j=next[j];
}
}
}
void kmp(char* s,char* t,int* next)
{
int i=0;
int j=0;
int len1=strlen(s);
int len2=strlen(t);
while(i
{
if(j==-1 || s[i]==t[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j==strlen(t))
{
cout<
}
}
int main(void)
{
char* s="acabaabaabcacaabc";
char* t="abaabcac";
int* next;
getNext(t,next);
kmp(s,t,next);
system("pause");
return 0;
}
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
小编个人微信号 jb51ccc
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!