
数据结构里实现KMP算法
求个程序,实现KMP算法,输入三组主串S和模式串P,输出模式串的Next(j)函数值,以及该P在S中的位置的定位函数值,即序号值。其中S的长度为15~25,P的长度为5~...
求个程序,实现KMP算法,输入三组主串S和模式串P,输出模式串的Next(j)函数值,以及该P在S中的位置的定位函数值,即序号值。其中S的长度为15~25,P的长度为5~8。
展开
3个回答
展开全部
KMP算法的C语言实现2007-12-10 23:33
基本思想:
这种算法是D.E.Knuth 与V.R.Pratt和J.H.Morris同时发现的,因此人们称为KMP算法。此算法可以在O(n+m)的时间数量级上完成串的模式匹配操作。
其基本思想是:每当匹配过程中出现字符串比较不等时,不需回溯i指针,而是利用已经得到的“部分匹配”结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。
#include <stdio.h>
#include <string.h>
int index_KMP(char *s,char *t,int pos);
void get_next(char *t,int *);
char s[10]="abcacbcba";
char t[4]="bca";
int next[4];
int pos=0;
int main()
{
int n;
get_next(t,next);
n=index_KMP(s,t,pos);
printf("%d",n);
return 0;
}
int index_KMP(char *s,char *t,int pos)
{
int i=pos,j=1;
while (i<=(int)strlen(s)&&j<=(int)strlen(t))
{
if (j==0||s[i]==t[j-1])
{
i++;
j++;
}
else j=next[j];
}
if (j>(int)strlen(t))
return i-strlen(t)+1;
else
return 0;
}
void get_next(char *t,int *next)
{
int i=1,j=0;
next[0]=next[1]=0;
while (i<(int)strlen(t))
{
if (j==0||t[i]==t[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}
}
基本思想:
这种算法是D.E.Knuth 与V.R.Pratt和J.H.Morris同时发现的,因此人们称为KMP算法。此算法可以在O(n+m)的时间数量级上完成串的模式匹配操作。
其基本思想是:每当匹配过程中出现字符串比较不等时,不需回溯i指针,而是利用已经得到的“部分匹配”结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。
#include <stdio.h>
#include <string.h>
int index_KMP(char *s,char *t,int pos);
void get_next(char *t,int *);
char s[10]="abcacbcba";
char t[4]="bca";
int next[4];
int pos=0;
int main()
{
int n;
get_next(t,next);
n=index_KMP(s,t,pos);
printf("%d",n);
return 0;
}
int index_KMP(char *s,char *t,int pos)
{
int i=pos,j=1;
while (i<=(int)strlen(s)&&j<=(int)strlen(t))
{
if (j==0||s[i]==t[j-1])
{
i++;
j++;
}
else j=next[j];
}
if (j>(int)strlen(t))
return i-strlen(t)+1;
else
return 0;
}
void get_next(char *t,int *next)
{
int i=1,j=0;
next[0]=next[1]=0;
while (i<(int)strlen(t))
{
if (j==0||t[i]==t[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}
}
参考资料: http://hi.baidu.com/zkheartboy/blog/item/33ef640eac733ec97acbe136.html

2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
2008-05-08
展开全部
#define MaxStrLen 200
#include "graphics.h"
# include"stdio.h"
# include"stdlib.h"
# include"conio.h"
char s1[MaxStrLen],s2[MaxStrLen],s3[MaxStrLen],p[20];
int next[20];
void input();
int Index_KMP(char* s,char* t,int pos,int next[]);
void get_next(char* s,int next[]);
void output();
main()
{
input();
get_next(p,next);
output();
}
void input()
{
printf("please input the string of S1:\n");
gets(s1);
printf("please input the string of S2:\n");
gets(s2);
printf("please input the string of S3:\n");
gets(s3);
printf("please input the string of p:\n");
gets(p);
}
int Index_KMP(char* s,char* t,int pos,int next[])
{
int i,j,ls,lt;
i=pos-1,j=-1;
ls=strlen(s); lt=strlen(t);
while(i<ls && j<lt) {
if(j==-1 || s[i]==t[j]) {
i++; j++;
}
else {
j=next[j]-1;
}
}
if (j>=lt) return i-lt+1;
else return 0;
}
void get_next(char* s,int next[])
{
int i,j;
i=1; j=0;
next[0]=0;
while (i<strlen(s))
{
if (j==0 || s[i-1]==s[j-1])
{
i++; j++;
next[i-1]=j;
}
else
j=next[j-1];
}
printf("\nnext=");
for (i=0;i<strlen(p);i++)
printf("%d, ",next[i]);
}
void output()
{ printf("\n%d",Index_KMP(s1,p,0,next));
printf("\n%d",Index_KMP(s2,p,0,next));
printf("\n%d",Index_KMP(s3,p,0,next));
getch();
}
#include "graphics.h"
# include"stdio.h"
# include"stdlib.h"
# include"conio.h"
char s1[MaxStrLen],s2[MaxStrLen],s3[MaxStrLen],p[20];
int next[20];
void input();
int Index_KMP(char* s,char* t,int pos,int next[]);
void get_next(char* s,int next[]);
void output();
main()
{
input();
get_next(p,next);
output();
}
void input()
{
printf("please input the string of S1:\n");
gets(s1);
printf("please input the string of S2:\n");
gets(s2);
printf("please input the string of S3:\n");
gets(s3);
printf("please input the string of p:\n");
gets(p);
}
int Index_KMP(char* s,char* t,int pos,int next[])
{
int i,j,ls,lt;
i=pos-1,j=-1;
ls=strlen(s); lt=strlen(t);
while(i<ls && j<lt) {
if(j==-1 || s[i]==t[j]) {
i++; j++;
}
else {
j=next[j]-1;
}
}
if (j>=lt) return i-lt+1;
else return 0;
}
void get_next(char* s,int next[])
{
int i,j;
i=1; j=0;
next[0]=0;
while (i<strlen(s))
{
if (j==0 || s[i-1]==s[j-1])
{
i++; j++;
next[i-1]=j;
}
else
j=next[j-1];
}
printf("\nnext=");
for (i=0;i<strlen(p);i++)
printf("%d, ",next[i]);
}
void output()
{ printf("\n%d",Index_KMP(s1,p,0,next));
printf("\n%d",Index_KMP(s2,p,0,next));
printf("\n%d",Index_KMP(s3,p,0,next));
getch();
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2008-04-28
展开全部
#include <stdio.h>
void getNext(char pat[], int next[])
{
int j = 0;
int k = -1;
next[0] = -1;
while (pat[j])
{
if ( k == -1 || pat[j] == pat[k])
{
j++;
k++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int index_KMP(char str[], char pat[])
{
int i = 0;
int j = 0;
int next[255];
getNext(pat, next);
while (str[i])
{
if (pat[j] == '\0')
{
return (i - j);
}
if (str[i] == pat[j])
{
i++;
j++;
continue;
}
i += next[j+1]+1;
}
if (pat[j] == '\0')
{
return (i - j);
}
return -1;
}
int main()
{
char str_pattern[]="kaka";
char str_src[]="iamkaka";
printf("%d\n",index_KMP(str_src, str_pattern));
return 0;
}
void getNext(char pat[], int next[])
{
int j = 0;
int k = -1;
next[0] = -1;
while (pat[j])
{
if ( k == -1 || pat[j] == pat[k])
{
j++;
k++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int index_KMP(char str[], char pat[])
{
int i = 0;
int j = 0;
int next[255];
getNext(pat, next);
while (str[i])
{
if (pat[j] == '\0')
{
return (i - j);
}
if (str[i] == pat[j])
{
i++;
j++;
continue;
}
i += next[j+1]+1;
}
if (pat[j] == '\0')
{
return (i - j);
}
return -1;
}
int main()
{
char str_pattern[]="kaka";
char str_src[]="iamkaka";
printf("%d\n",index_KMP(str_src, str_pattern));
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询