|

楼主 |
发表于 2021-11-1 23:01:09
|
显示全部楼层
本帖最后由 划句顾 于 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;
- }
复制代码
不过,我觉得这个新的代码有点长,运行有点慢。但是我就只能搞这个
运行结果:
希望各位鱼油萌,可以搞个简单易懂的代码分享一下,头秃了 |
|