问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

谁有KMP算法的C语言实现啊

发布网友 发布时间:2022-05-26 12:28

我来回答

2个回答

热心网友 时间:2023-11-08 01:38

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
void getNext(const char * t,int * Next)//get the Next array
{
int k=-1;
int j=0;
int size=strlen(t);
Next[0]=-1;
while(j<size)
{
if(k==-1||t[j]==t[k])//if k==-1 there are two conditions
//one is this is the first time entering the loop
{ //if t[j]==t[k] get the next[j+1] directly
k++;//the other is the end of the iteration cos k==-1;
j++;
Next[j]=k;//whatever Next[j]=k
}
else
k=Next[k];
}
}
int myStrstr(const char * Dest,const char *subStr)//find the starting position of the sub
{ //in the Dest through KMP
int destSize=strlen(Dest);
int subSize=strlen(subStr);
int i,j;
int * Next=(int *)(malloc(sizeof(int)*subSize));
i=j=0;
assert((Dest!=NULL)&&(subStr!=NULL));
getNext(subStr,Next);
while(i<destSize&&j<subSize)
{
if(j==-1||Dest[i]==subStr[j])//if j==-1 the main string need match the next elements
{ //and the subString begin from the beginning
i++; //if Dest[i]==subStr[j] both string need shift to the
j++; // next elements
}
else
j=Next[j]; //if match fail,glide back to Next[j]
}
if(j==subSize)return i-j;
return -1;
}
int main()
{
char *temp,*sub,* Dest;//to store the substring to be matched
int ch;
unsigned int templen,length=20*sizeof(char);
unsigned int mlength=20*sizeof(char);//the original length of the memory
sub=(char*)malloc(length);
Dest=(char*)malloc(length);
if(sub==NULL||Dest==NULL)//allocation failure
{
printf("memory allocate failure\n");
exit(0);
}
temp=sub;
printf("please input the substring:\n");
while((ch=getchar())!=10)//read the sub String
{
if((temp-sub)/sizeof(char)==length)//if running out of the memory
{
templen=length;
sub=realloc(sub,length+=20*sizeof(char));
if(sub==NULL)
{
printf("sub memory allocate failure\n");
exit(0);
}
temp=sub+templen*sizeof(char);//reset the temp cos the sub may change its value
}
*temp++=ch;
}
*temp='\0';
temp=Dest;
printf("please input the mainstring:\n");
while((ch=getchar())!=10)//read the main String
{
if((temp-Dest)/sizeof(char)==mlength)
{
templen=mlength;
Dest=realloc(Dest,mlength+=20*sizeof(char));//if running out of the memory
if(Dest==NULL)
{
printf("sub memory allocate failure\n");
exit(0);
}
temp=Dest+templen*sizeof(char);//reset the temp cos the Dest may change its value
}
*temp++=ch;
}
*temp='\0';
printf("the starting position is :%d\n",myStrstr(Dest,sub));//get the starting position
free(Dest);
free(sub);
return 0;
}

热心网友 时间:2023-11-08 01:39

其基本思想是:每当匹配过程中出现字符串比较不等时,不需回溯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];
}

}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音火山版怎么查看钱包 查看方法介绍 职能手机v3职能手机的优点和缺点 关于Cascode运放的偏置电路 vb WindowsMediaPlayer1控件怎么同时播放两个视频文件 太阳马戏团特点 【加拿大必知百科系列】加拿大文化璀璨之星—太阳马戏团 太阳马戏团简介 垃圾短信如何拦截设置 垃圾短信拦截设置的方法 vivo xplay3s用奇兔刷机刷机后打电话显示SIM卡错误是怎么回事?卡重新插... 为什么我的vivo xplay3s联通卡插上去显示无SIM卡呢? C语言数据结构中KMP算法编程中的问题 求大神解答 羽毛球 场地规则 单打 与双打 求详细解释 有图更好 水开了鸡蛋羹蒸几分钟 谁能告诉我《二级建造师》的报考条件,我是函授大专的 vivoZ1青春版 内存卡 插上没反应 请问vivo手机vivoz1青春版支不支持默认储存位置改为外置sd卡 外观有点像菜花,又不是西兰花的菜是什么菜 为什么vivoz1青春版手机不支持外置储存却可以装sd卡啊? 外观有点像菜花,又不是西兰花的菜是什么菜,是绿色的 除了西兰花还有什么菜可以排毒护肝 大家看看我这个空调制热一小时几度电?? 功率1200w制冷量3600w的空调一晚上多少度电 外国发明的,捆仙绳,在哪能订购 笔记本安全模式里面没有系统更新 仙剑三外传图谱 城市管理中存在的什么问题是囚徒博弈的结果和囚徒困境的表现 仙剑3外传问情篇里的和成物品在哪弄得到(不只是尸块)~~~ 1200w一天用多少电 仙剑奇侠传三外传问情篇中梦溪杂录有多少页?各从哪拿? XP补丁更新,一定要进入安全模式才可以更新吗? 这个模式匹配怎么做?没头文件,怎样编辑头文件呢? 串KMP算法的C语言实现: #include 唐装用什么料子做好,年轻人穿什么颜色什么图案? winform窗口写登录怎么弹出登录成功 有一首歌里面有句歌词里面有庄周晓梦迷蝴蝶 穿越火线枪战王者中购买扭蛋机提升v等级吗? 荣耀6标准版可以装32G内存卡吗 华为荣耀6有必要装内存卡吗 华为荣耀6plus可以装内存卡吗? 从收藏的角度看哪种普洱茶最好? 普洱茶真的可以收藏吗? 为什么只要睡着就做梦? 上课时间更改通知怎么写 智能手机触摸屏摔坏好更换吗? 智能手机的触摸屏好换吗? 好用就触摸屏坏了能换一个吗 康佳LED42X9000PD换屏多少钱?才买几个月,被儿子打坏了 wow怎样才能把自己的血条显示搞成百分比? 江西省会计证怎么考 ?程序是什么? 苹果手机的充电器行货与水货有区别么 位于四川省阿坝藏族羌族自治洲的四姑娘大峰适合国内初级登山者吗?这座山峰高约多少米?