[时空权衡]字符串匹配KMP算法代码(引自算法导论)

[时空权衡]字符串匹配KMP算法代码(引自算法导论)

这里只贴一份来自《算法导论》的伪代码改写的代码。

void KMP_prefix( const char *t, int *
next )
{

     
int len =

strlen(t) ;
     
int i, j = 1

;
      next[
0] = 1

;
     
//请读者自行思考i什么时候增长



     for( i=1; i<len; ++
i )
      {  
    
//

i永远和j+1位的比较(因为j初始值为-1)
    
//如果失配就执行跳转。直到j为-1为止。



         while( (j+1>0)&&(t[j+1]!=
t[i]) )
              j
=

next[j] ;
    
//如果匹配,则两个串的指针都增长



         if( t[j+1]==
t[i] )
             
++

j ;
    
//

这句很抽象,意思是:
    
//

跳转的位置永远是匹配成功的下一位
    
//也是唯一给跳转表赋值的一句



          next[i] = j+1
;
      }
}

//主函数:可以看出这个函数与上面的函数极其相似


int KMP_matcher( const char *s, const char *t, int
beg )
{

     
int l1 = strlen(s), l2 =

strlen(t) ;
     
int *next = new int

[l2] ;
      KMP_prefix( t, next ) ;
     
int i, j = 1, ans =

beg ;
     
for( i=beg; i<l1; ++

i )
      {

         
while( (j+1>0)&&(t[j+1]!=

s[i]) )
          {

              j
=

next[j] ;
          }
         
if( t[j+1]==

s[i] )
          {

             
++

j ;
          }
         
if( j+1==

l2 )
          {

              ans
= il2+1

;
             
break

;
          }
      }
     
return

ans ;
}

转载于:https://www.cnblogs.com/microgrape/archive/2011/05/12/2043927.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110615.html原文链接:https://javaforall.net

(0)
上一篇 2021年8月11日 下午5:00
下一篇 2021年8月11日 下午6:00


相关推荐

  • vmware系统安装教程_vmware安装虚拟机

    vmware系统安装教程_vmware安装虚拟机一、VMware安装所安装的版本为VMware15链接:https://pan.baidu.com/s/1vzaS4PL2e0XNis-P-M-o4A&shfl=sharepset提取码:7r3d新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计,将会带来全新的写…

    2022年8月16日
    3
  • java输出语句_java输入输出语句是什么

    java输出语句_java输入输出语句是什么在java中,输入语句为“Scanner对象.next()系列方法”,例“Scanner对象.nextLine()”表示输入字符串;输出语句为“System.out.println()”、“System.out.print()”等。对于经常上机刷题的来说,首先得解决输入输出方法,Java的输入输出流在Java学习过程的后面部分才会接触,但是我们可以掌握一些简单的,常用的输入输出方法输出流java常…

    2022年7月7日
    28
  • 用Java 写一个冒泡排序

    用Java 写一个冒泡排序冒泡排序几乎是个程序员都写得出来,但是面试的时候如何写一个逼格高的冒泡排序却不是每个人都能做到,下面提供一个参考代码:importjava.util.Comparator;/***排序器接口(策略模式:将算法封装到具有共同接口的独立的类中使得它们可以相互替换)*/publicinterfaceSorter{ /** *排序 *@paramlist待排序的数组 */ public<TextendsComparable<T>>voids

    2022年7月7日
    31
  • bool型函数「建议收藏」

    bool型函数「建议收藏」bool介绍C++中bool函数如果值非零就为True,为零就是False。比如写数据结构的时候,有时候需要判断一下链表是不是为空,这时候需要用到bool函数,再者,你看到bool就知道这个函数返回值只是用于判断真假。bool函数返回的只有true和false。而int会返回各种数字,但是你关心的不是数字的多少,而是这个数字为不为0.所以这种情况用bool会更加简洁,规范,你看到bo…

    2022年6月5日
    33
  • 国产AI大模型全解析[项目代码]

    国产AI大模型全解析[项目代码]

    2026年3月14日
    2
  • mysql实现位图索引_位图索引,数据库索引浅浅的学习

    mysql实现位图索引_位图索引,数据库索引浅浅的学习位图 BitMap 索引前段时间听同事分享 偶尔讲起 Oracle 数据库的位图索引 顿时大感兴趣 说来惭愧 在这之前对位图索引一无所知 因此趁此机会写篇博文介绍下位图索引 1 案例有张表名为 table 的表 由三列组成 分别是姓名 性别和婚姻状况 其中性别只有男和女两项 婚姻状况由已婚 未婚 离婚这三项 该表共有 100w 个记录 现在有这样的查询 select fromtablewhe

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号