串的模式匹配——BF算法

一、模式匹配简介

S为主串,T为模式串。在主串S中寻找模式串T的过程称为模式匹配。

定位函数的功能是求模式串T在主串S中从pos的位置开始第一次出现的位置序号,该函数也称为串的模式匹配。

二、算法思想

从主串S的pos位置起,与模式串T逐位匹配。

1、初始化:主串从pos开始,模式串从头开始;

2、两串逐位比较:当主串、模式串均未遍历完时,对应字符做比较,若相等则主串、模式串的当前比较位置均后移;若不等则主串从开始比较位置的下一个开始,模式串从头开始;

3、判别:若匹配成功则返回起始位置,若不成功则返回 -1。

设置 i、j、start指示器:

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

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

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

三、算法实现

int StrIndex(StringPtr s, int pos, StringPtr t) {
    int i, j, start;

    start = pos;
    i = start;
    j = 0;

    while (i < s->len && j < t->len) {
        if (s->ch[i] == t->ch[j]) {
            ++i;
            ++j;
        } else {
            /* 重新设置i、j、start */
            ++start;
            i = start;
            j = 0;
        }
    }

    /* j >= t->len代表匹配成功 */
    return j >= t->len ? start : -1;
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值