串的匹配算法:BF以及KMP

来源:互联网 发布:淘宝促销文案范文 编辑:程序博客网 时间:2024/05/21 09:14

串的模式匹配,即在给定主串S中找到等于子串T的过程称为模式匹配。T称为模式。

串的匹配算法有两种:简单匹配算法(也称BF算法)和KMP匹配算法。

int i =pos ; j =1 ;while( i <= S[0] && j<T[0])   if(S[i]==T[j])   {  i++ ; j ++; } else      { i = i-j+2 ; j=1 ; }  //此处为回溯 +2是因为j比已查的字符数多1,即减j的时候多减了个1,然后S中pos位置已经查了故i+1,
    即 i - j +2 ;  其也可直接用 i = pos+1 ; j=1 ;代替。 
if (j>t[0]) return ( i-t[0]) ; else return 0 ;

KMP算法思想:

先求出next[j]表,然后根据next[b]进行匹配。匹配思想为:

令i的初值为pos ,j 的初值为1,在匹配过程中,s[i] = t[j] ,则 i++ ,j++

若 不等,则i不变,j进行回溯,即 j = next [ j ] ;

回溯后有两种情况:

1. j退到某个next值时,字符比较相等,则i++,j++继续进行匹配;

2. j退到值为0,(即模式的第一个字符失配),此时也需要i++ , j++ ;即j的值变为1

算法描述:s为主串,t为子串,即模式

int i = pos , j =1 ;

while( i<= s[0] && j<= t[0])

if ( j ==0 || s[i] == t[j]) { i++ ; j++ ; }

else  j = next[j] ;

if ( j>t[0] )  return  i-t[0] ;  //返回找到的子串第一个字符在主串中的位置。

 特殊法验证: 在 abcdabdcf    中找寻 abd 

    123456789  ,  i的值在匹配完之后为8, t[0] = 3 , return 5 ; 正确;

next函数值获取算法(只与模式t有关):

int i =1 , j = 0 ;

next[1] =0 ;

while( i<t[0] )

if (j==0 || t[i] == t[j]) { i++ ; j++ ; j = next[j] }

else  j = next[i] ;


原创粉丝点击