本帖最后由 划句顾 于 2021-11-1 23:07 编辑
我重新搞了一个
代码如下:/*
*author : laogu
*time :2021/11/1
*fuction:kmp算法
*/
#include<iostream>
#include<string.h>
using namespace std;
//next 函数
void get_next(char *T,int *next,int lent)
{
int i = 1,j = 0;
next[1]=0;
while(i<lent)
{
if(j==0||T[i]==T[j])
{
++i;
++j;
if(T[i]!=T[j])
{
next[i] = j;
}
else //当相邻的字符相等的情况下,加了这个可以避免漏掉一些信息
{
next[i] = next[j];
}
}
else{
j = next[j];
}
}
}
//KMP算法
int Index_KMP(char *S,char *T,int lens,int lent)
{
int i = 0,j = 0;
int next[255];
get_next(T,next,lent);
while(i<lens && j<lent){
if(j==0||S[i]==T[j])
{
++i;
++j;
}
else{
j = next[j];
}
}
if(j==lent)
return i-lent+1; //匹配成功
else
return 0; //匹配失败
}
//主函数
int main()
{
char S[30],T[20]; //定义两个串
cout<<"请输入主串S: ";
scanf("%s",&S); //必须是%s,如果是%c的话,不能输入一大串的字符
cout<<"请输入字串T: ";
scanf("%s",&T);
int lent,lens; //字符串的长度
lens = strlen(S); //母串的长度
lent = strlen(T); //子串的长度
int t = Index_KMP(S,T,lens,lent);
printf("子串从主串的第%d位开始匹配成功!\n",t);
return 0;
}
不过,我觉得这个新的代码有点长,运行有点慢。但是我就只能搞这个
运行结果:
希望各位鱼油萌,可以搞个简单易懂的代码分享一下,头秃了 |