《数据结构》-算法4.5 BF算法

int Index(SString S, SString T, int pos)
{ // 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0。
    // 其中,T非空,1≤pos≤StrLength(S)。算法4.5
    int i, j;
    if (1 <= pos && pos <= S[0])
    {
        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;
            }
        if (j > T[0])
            return i - T[0];
        else
            return 0;
    }
    else
    {
        return 0;
    }
}

 

示例
 

#include <stdio.h>
#include <string.h>

/*
目标串:a b a b c b a c d a
模式串:b a c d a

       1 2 3 4 5 6 7 8 9 10
目标串:a b a b c b a c d a 
模式串:          b a c d a

知识点:
1、字符串的结束标志是 `\0`
2、求字符串长度的函数:strlen() 其求的长度不包含 '\0'(空字符) 占用的空间
3、'\0'是转译字符,意思是告诉编译器,这不是字符0,而是空字符。空字符\0对应的二进制为00000000,而数字0为00110000
*/

int BF(char S[], char T[])
{
    int index = 0;
    int i = 0;
    int j = 0;
    while (S[i] != '\0' && T[j] != '\0')
    {
        if (S[i] == T[j])
        {
            //如果匹配成功,则继续比较下一对字符
            i++;
            j++;
        }
        else
        {
            //如果匹配不成功,主串和子串回溯坐标。index记录的是每次匹配时的开始位置
            index++;
            i = index;
            j = 0;
        }
    }
    if (T[j] == '\0')
        return index + 1;
    else
        return 0;
}

int main(int argc, char *argv[])
{
    char a[30] = "ababcbacda";
    printf("主串: %s 长度为 %d \r\n", a, (int)strlen(a));

    char b[10] = "bacda";
    printf("子串: %s      长度为 %d \r\n", b, (int)strlen(b));

    printf("匹配的开始位置是:%d\r\n", BF(a, b));

    return 0;
}

/*
编译:gcc test.c -o test
运行:./test
结果:
主串: ababcbacda 长度为 10
子串: bacda      长度为 5
匹配的开始位置是:6
*/

/********************* end of file *********************/

时间复杂度

O(m*n)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值