串的匹配算法:BF以及KMP

本文详细介绍了串的模式匹配概念及两种主要算法:简单匹配(BF)与KMP算法。通过对算法步骤的解析,帮助读者理解如何在主串中查找子串,并提供了next数组计算方法以提高匹配效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

串的模式匹配,即在给定主串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] ;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值