串的子串(模式串)匹配算法

一、串的模式匹配算法

1、算法目的:

确定主串中所含子串(模式串)第一次出现的位置(定位)。

2、算法应用:

搜索引擎、拼写检查、语言翻译、数据压缩

3、算法种类:

BF算法(Brute-Force, 又称古典的、经典的、朴素的、穷举的)

●KMP算法(特点:速度快)

二、BF算法(重点掌握)

1、Brute-Froce简称为BF算法,亦称简单匹配算法。采用穷举法的思路。如下图所示:

算法的思路是从S的每一个字符开始依次与T的字符进行匹配。

2、算法描述

int Index BF(SString S, SString T, int pos){

int i=pos, j=1;                          //pos表示可以从任何一个字符开始,不一定为第一个字符

while (i<=S.length && j<=T.length) {  //只要i到了串尾或者j到了串尾就不用循环了,要不然就一直循环

if (s.ch[i]==t.ch[j]) {++i; ++j; }               //主串和子串依次匹配下一个字符
else {i=i-j+2;j=1;}                             //主串、 子串指针回溯重新开始下一次匹配
}

if (j>=T.length) 
return i-T.length;                             //返回匹配的第一个字符的下标
else return 0;                                 //模式匹配不成功
}

算法的进一步解释:

①将主串的第pos个字符和模式串的第一个字符比较,

●若相等,继续逐个比较后续字符;

●若不等,从主串的下一字符起, 重新与模式串的第一个字符比较。

②直到主串的一个连续子串字符序列与模式串相等。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。

③否则,匹配失败,返回值0。

三、KMP算法(难点)

1、KMP算法较BF算法有较大改进,从而使算法效率有了某种程度的提高。

2、算法的设计思想:利用已经部分匹配的结果而加快模式串的滑动速度,且主串S的指针不必回溯。

3、为此,定义next[j]函数, 表明当模式中第j个字符与主串中相应字符"失配”时,在模式中需重新和主串中该字符进行比较的字符的位置。如下图所示为next[j]函数。

 注:next[j]函数中的j和k都是相对于字串(模式串)而言的,与主串无关。即上图中的第一种情况表示字串(模式串)的前k-1个元素等于最后一个元素的前k-1个元素的话并且此时的k最大(因为k可能有多个取值),则next[j]就等于k。j表示字串(模式串)有j个字符。

4、算法描述

int Index KMР(SString S,SString T, int pos) {
i=pos,j =1;
while (i<S.length && j<T.length){

if (j==0||S.ch[i]==T.ch[j]){i++;j++;}
else
j=next[j];                   /*i不变j后退*/
}
if (j>T.length) return i-T.length;          /*匹配成功*/
else return 0;                             /*返回不匹配标志*/
}

void get_next(SString T,int &next[]){               //next[j]函数声明
i=1;next[1]=0;j=0;

while(i<T.length){

if(j==0||T.ch[i]==T.ch[j]){
++i; ++j;
next[i]=j;
else
j = next[j];
    }
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜深人静码代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值