字符串匹配——朴素算法Brute-Force(布鲁特-福斯算法)

布鲁特-福斯算法

简单的模式匹配算法是一种带回溯的匹配算法。

一.算法思想

从主串S的第pos个字符开始,和模式串T的第一个字符开始比较,如果相等就继续比较后续字符,如果不等,则从(回溯到)主串S的第pos+1个字符开始重新和模式串T进行比较,直到模式串T中的每一个字符和主串的每一个连续字符子序列全部相等,则称匹配成功,返回和T第一个字符相等的字符在主串S中的位置;或者主串中没有和模式串相等的字符序列,则称匹配不成功。

二.算法实现代码

设置i,j,start三个指示器:

i——指向主串S中当前比较的字符,起始指向S的首字符,此后每比较一步,后移一个位置,一趟匹配失败时,回溯到该趟比较起点的下一个位置。

j——指向子串T中当前比较的字符,起始指向T的首字符,此后每比较一步,后移一个位置,一趟匹配失败时,回溯到T的首字符处。

start——记录每趟比较时在主串S中的起始位置,每趟比较后,后移一个位置,以便确定下一趟的起始位置。

#include <stdio.h>
#include "SstringHeader.h "

/*主串S,模式串T*/
int navie_string_matcher(SString s,int pos,SString t)
{
    int i,j,start;
    start = pos; i = start; j = 0;/*主串从pos开始,模式串从头开始*/
    if (t.len==0) return 0; /*模式串为空串时,是任意串的匹配串*/
    while (i < s.len && j < t.len )
        if (s.ch[i]==t.ch[j])/*当前对应字符相等时推进*/
        {
            i++;
            j++;
        }
        else
        {
            start++;  /*对应字符不等时回溯*/
            i = start;/*主串从start+1开始,模式串从头(0)开始*/
            j =0;
        }
        if (j >= t.len) return(start); /*匹配成功时返回匹配起始位置*/
        else return -1;    /*匹配不成功时,返回-1*/

}

算法实现结果截图:
这里写图片描述

三.算法实现举例

主串S:a b a b c a b c a c b a b
子串T:a b c a c

pos = 0; start = pos=0;i=start = 0;j=0;
s.len = 13; t.len=5分别为字符串s,t的长度

while (i < s.len && j < t.len )
        if (s.ch[i]==t.ch[j])/*当前对应字符相等时推进*/
        {
            i++;
            j++;
        }
        else
        {
            start++;  /*对应字符不等时回溯*/
            i = start;/*主串从start+1开始,模式串从头(0)开始*/
            j =0;
        }

(1) i=0;j=0;i<13&&j<5为真
if( s.ch[i]==t.ch[j]),即判断s.ch[0]==t.ch[0],s.ch[0]=a,t.ch[0]=a,为真,
i++;j++;
i=1;j=1;
i=1;j=1;也满足字符匹配;
i=2;j=2时,s.ch[2]=a,t.ch[2]=c
1

(2)start=1,i=1,j=0;过程同上,只给出匹配结果图:
2
(3)start=2,i=2;j=0;
3
(4)start=3;i=3;j=0;
4
(5)start=4;i=4;j=0;
5
(6)start=5;i=5;j=0;
6
j=5,while循环不满足;
执行

if (j >= t.len) return(start); /*匹配成功时返回匹配起始位置*/

返回start=5;

四.算法复杂度分析

算法的最坏时间复杂度为O((s.len-t.len+1)*t.len)

Reference:
《数据结构——用C语言描述》,耿国华著 . 4.2串的存储实现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值