首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >knuth morris pratt算法实现中的问题

knuth morris pratt算法实现中的问题
EN

Stack Overflow用户
提问于 2015-11-24 01:08:44
回答 1查看 97关注 0票数 0

我正在尝试在java中实现Knuth Morris Pratt算法来进行模式搜索,但是它没有给出任何结果。我检查过,prefixTable生成器代码运行良好,但是搜索的主要代码不起作用。

代码语言:javascript
复制
 public void KMPAlgorithm(String T, String P){
           int pi[]= prefixFinder(P);
           int n=T.length();
           int m=P.length();
           int q=0;
           for(int i=0; i<m; i++)System.out.print(pi[i]+"  ");
           for(int i=0; i<n; i++){

               while(q>0 && P.charAt(q)!=T.charAt(i)){
                   q=pi[q-1];
               }
               if(P.charAt(q)==T.charAt(i)){
                   q++;
               }


               if(q==(m-1)){System.out.println("Pattern occurs at "+(i-(m-1)));
                 q=pi[q];
               }


           }

这是前缀生成器算法

代码语言:javascript
复制
private int[] prefixFinder(String P){
           int m=P.length();
           int pi[]= new int[m];
          pi[0]=0;
          int k=0;
          for(int i=1;i<m; i++){
              while( k>0 && P.charAt(k)!=P.charAt(i)){
                  k=pi[k];
              }
              if(P.charAt(k)==P.charAt(i)){
                  k++;

              }
              pi[i]=k;
          }


           return pi;
       }

作为输出,它没有给出空白,这表明它在某些边界情况下没有找到模式

EN

回答 1

Stack Overflow用户

发布于 2015-11-24 02:32:12

您的q变量没有检查最后一个字母,因为您将q更改为m-1,而不是m。

代码语言:javascript
复制
 if(q==(m-1)){System.out.println("Pattern occurs at "+(i-(m-1)));
             q=pi[q];
           }

 if(q==(m)){System.out.println("Pattern occurs at "+(i-(m-1)));
             q=pi[q];
           }

另外,因为你的Q现在已经结束了,所以你也需要改变

代码语言:javascript
复制
q=pi[q];

代码语言:javascript
复制
 q=pi[q-1];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33876642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档