[时空权衡]字符串匹配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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • veryCD名言「建议收藏」

    veryCD名言「建议收藏」电骡文化:1.快并快乐着!2.共享世界,有你才精彩!3.你共享一小文件,对于你来说是一小文件,但对于世界上的骡友来说是一个大文件。来自VeryCD 的原创(VeryCD 名人名言):(!)4.分享互联网5.梦里寻她千百度,蓦然回首,那资源竟在VeryCD 下载处。●———————————————————————————————————————————————————…

    2022年8月10日
    3
  • Java中Boolean是什么?

    Java中Boolean是什么?Java中的boolean其实就是c中的bool型(逻辑型)数据类型。在java中,boolean值只能是true和false,而不能用0和1代替,并且一定要小写。要注意到的是,数值的0、-0、特殊值的null、NaN、undefined以及空字符(””)都会被解释为false,其他值则会被解释为true。…

    2022年7月7日
    16
  • 2021爱智先行者——EdgerOS Spirit 1深度使用体验与EdgerOS应用开发实践「建议收藏」

    一、前言①智能边缘计算操作系统EdgerOS是为万物互联时代而生的智能操作系统。为广大开发者提供基于互联网技术栈的操作系统平台,极大简化了物联网App开发难度,提高开发效率。通过爱智云,EdgerOS为开发者提供了强大的云-边-端协同能力,开发者无需关心设备是本地还是远程连接,EdgerOS能够无缝切换,给用户带来丝滑的使用感受,实现“多用户-多终端-多设备”的实时连接与互动。EdgerOS是下一代面向物联网和边缘计算的智能操作系统,可广泛应用于面向个人、家庭和行业的物联网产品和解决方

    2022年4月10日
    79
  • oracle数据库建表语句大全_sql server建表语句

    oracle数据库建表语句大全_sql server建表语句Oracle数据库建表语句#1.建表语句createtableCUST_INFO(CUST_IDVARCHAR(36)notnull,CUST_TYPEVARCHAR(50),CUST_NAMEVARCHAR(200),ID_NO…

    2022年9月8日
    0
  • 使用fiddler对手机APP进行抓包

    使用fiddler对手机APP进行抓包在做手机或移动端APP的接口测试时,需要从开发人员那里获取接口文档,接口文档应该包括完整的功能接口、接口请求方式、接口请求URL、接口请求参数、接口返回参数。如果当前项目没有接口文档,则可以使用fiddler对APP进行抓包确认。在手机上对APP进行操作,然后在Fiddler中可以抓取对应的网络交互信息(一个功能中可能设计多个接口的交互)。在抓取的信息中可以看到接口请求方式、接口请求URL、接口请

    2022年5月16日
    82
  • 小虾的sql server 2000 成长之路

    小虾的sql server 2000 成长之路

    2021年7月29日
    21

发表回复

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

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