鱼C论坛

 找回密码
 立即注册
查看: 3517|回复: 8

我这个kmp算法,在中间有可以匹配的值,但是最后运行的时候没有结果。救命

[复制链接]
发表于 2021-11-1 20:24:47 | 显示全部楼层 |阅读模式
30鱼币
  1. /*******
  2. *author :LaoGu
  3. *time   :2021/10/31
  4. *fuction:模式匹配串--KMP算法
  5. *******/
  6. #include<iostream>
  7. #include<string.h>

  8. using namespace std;

  9. #define MAXSIZE 100

  10. typedef struct{
  11.   char ch[MAXSIZE+1];
  12.   int length;
  13. }SString;

  14. void get_next(SString T,int *next)
  15. {
  16.         int i = 1,j=0;
  17.         next[1]=0;
  18.         while(i<T.length)
  19.         {
  20.                 if(j==0||T.ch[i]==T.ch[j])
  21.                 {
  22.                         ++i;
  23.                         ++j;
  24.                         if(T.ch[i]!=T.ch[j])
  25.                         {
  26.                                 next[i] = j;
  27.                         }
  28.                         else
  29.                         {
  30.                                 next[i] = next[j];
  31.                         }
  32.                 }
  33.                 else{
  34.                         j = next[j];
  35.                 }
  36.         }

  37. }

  38. int index_KMP(SString S,SString T,int pos){
  39.    int i = pos,j = 1;
  40.    int next[255];
  41.    get_next(T,next);
  42.    while(i<=S.length && j<=T.length){
  43.      if(j==0||S.ch[i]==T.ch[j])
  44.          {
  45.                  ++i;
  46.                  ++j;
  47.          }
  48.          else{
  49.                  j = next[j];
  50.          }
  51.    }

  52.     if(j>=T.length)
  53.            return i-T.length;  //匹配成功
  54.    else
  55.        return 0;  //匹配失败
  56. }

  57. int main(){
  58.         SString S,T;

  59.         printf("请输入母串:");
  60.         cin>>S.ch;   
  61.         S.length = strlen(S.ch);

  62.         printf("请输入子串:");
  63.         cin>>T.ch;
  64.         T.length = strlen(T.ch);

  65.         int t = index_KMP(S,T,1);
  66.         if(t){
  67.             printf("在[%d]的地方成功匹配\n",t);
  68.         }
  69.         else("匹配失败!!!\n");
  70.         return 0;
  71. }
复制代码



                               
登录/注册后可看大图

1635769170(1).jpg

在末尾的值就可以匹配,但是在中间可以匹配的这种情况就不行了
1635769260(1).jpg

还有这种情况,明明没有匹配的值,但是它却有结果。
1635769326(1).jpg


                               
登录/注册后可看大图

希望各位大佬,能在我的代码的基础上修改,孩子头要秃了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-1 23:01:09 | 显示全部楼层
本帖最后由 划句顾 于 2021-11-1 23:07 编辑

我重新搞了一个
代码如下:
  1. /*
  2. *author : laogu
  3. *time   :2021/11/1
  4. *fuction:kmp算法
  5. */
  6. #include<iostream>
  7. #include<string.h>

  8. using namespace std;

  9. //next 函数
  10. void get_next(char *T,int *next,int lent)  
  11. {
  12.         int i = 1,j = 0;
  13.         next[1]=0;
  14.         while(i<lent)
  15.         {
  16.             if(j==0||T[i]==T[j])
  17.         {
  18.             ++i;
  19.             ++j;
  20.         if(T[i]!=T[j])
  21.         {
  22.             next[i] = j;
  23.         }
  24.         else   //当相邻的字符相等的情况下,加了这个可以避免漏掉一些信息
  25.         {
  26.             next[i] = next[j];
  27.         }
  28.         }
  29.         else{
  30.              j = next[j];
  31.             }
  32.     }       
  33. }

  34. //KMP算法
  35. int Index_KMP(char *S,char *T,int lens,int lent)
  36. {
  37.      int i = 0,j = 0;
  38.      int next[255];
  39.      get_next(T,next,lent);
  40.      while(i<lens && j<lent){
  41.      if(j==0||S[i]==T[j])
  42.          {
  43.             ++i;
  44.             ++j;
  45.          }
  46.          else{
  47.               j = next[j];
  48.          }
  49.    }

  50.     if(j==lent)   
  51.            return i-lent+1;  //匹配成功
  52.    else
  53.        return 0;  //匹配失败
  54. }

  55. //主函数
  56. int main()
  57. {
  58.     char S[30],T[20];  //定义两个串
  59.    
  60.     cout<<"请输入主串S: ";
  61.     scanf("%s",&S);    //必须是%s,如果是%c的话,不能输入一大串的字符

  62.     cout<<"请输入字串T: ";
  63.     scanf("%s",&T);
  64.    
  65.     int lent,lens;     //字符串的长度
  66.     lens =  strlen(S);  //母串的长度
  67.     lent =  strlen(T);  //子串的长度

  68.     int t = Index_KMP(S,T,lens,lent);     
  69.     printf("子串从主串的第%d位开始匹配成功!\n",t);
  70.     return 0;
  71. }
复制代码




                               
登录/注册后可看大图

不过,我觉得这个新的代码有点长,运行有点慢。但是我就只能搞这个


                               
登录/注册后可看大图

运行结果:
1635778554(1).jpg


                               
登录/注册后可看大图

希望各位鱼油萌,可以搞个简单易懂的代码分享一下,头秃了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-1 23:30:27 | 显示全部楼层
划句顾 发表于 2021-11-1 23:01
我重新搞了一个
代码如下:

但是我现在觉得这个新的有点问题!!!算了不管了,先交作业再说了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-2 00:26:19 | 显示全部楼层
划句顾 发表于 2021-11-1 23:01
我重新搞了一个
代码如下:

这个真的有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-2 09:55:40 | 显示全部楼层
数据结构让人头秃
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-2 10:16:37 | 显示全部楼层
lei1996 发表于 2021-11-2 09:55
数据结构让人头秃


如果写不出来还好,东西写出来后一堆错误才要命
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-2 11:10:31 | 显示全部楼层
划句顾 发表于 2021-11-2 10:16
如果写不出来还好,东西写出来后一堆错误才要命

老实说  我一直没看懂你的next数组怎么构建的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-2 14:57:56 | 显示全部楼层
lei1996 发表于 2021-11-2 11:10
老实说  我一直没看懂你的next数组怎么构建的

说实话,我写完我都懵了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-15 16:50:25 | 显示全部楼层
看下 数据结构
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 12:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表