湖南科技大学《数据结构》实验 问题 G: 子串定位BF算法

湖南科技大学程序测评系统
2021年第二学期《数据结构》实验

问题 G: 子串定位BF算法

时间限制: 1 Sec 内存限制: 32 MB

题目描述

在《数据结构》教材第92页算法4-1中已经描述了定位子串的BF算法。
书中的算法思想是这样的:分别利用计数指针i和j指示主串S和模式串T中当前正待比较的字符位置。算法的基本思想是:从主串S的第pos个字符起和模式的第一个字符比较之,若相等,则继续逐个比较后续字符,否则从主串的下一个字符起再重新和模式的字符比较之。依次类推,直至模式T中的每个字符依次和主串S中的一个连续的字符序列相等,则称匹配成功,函数值为和模式T中第一个字符相等的字符在主串中的序号,否则称匹配不成功,函数值为零。

输入

输入3组字符串,每组字符串占一行。每行包含由空格分隔的两个字符串,字符串仅由英文小写字母组成且长度不大于100。3组字符串,每组字符串占一行。每行包含由空格分隔的两个字符串,字符串仅由英文小写字母组成且长度不大于100。

输出

每组数据输出2行,第一行是S中每次比较的字符,第二行是后一个字符串在前一个字符串中的位置,如果不匹配,则输出0。

样例输入

string str
thisisalongstring isa
nosubstring subt

样例输出

str
1
thisisisa
5
nosubsubsttring
0

提示

数据结构和教材第90页SString定义一致。具体解法只要在书中算法4.1的算法描述中,将在每次比较时输出S中对应的字符即可,最后将函数结果存储下来并输出

解答

#include<stdio.h>
#include<string.h>
#define MAXLEN 10000
typedef struct//定义结构体
{
    char ch[MAXLEN];
    int length;
} SString;
int index_BF(SString S, SString T, int pos)//创建BF算法函数
{
    int i, j;
    i = pos;//pos的目的是为了后面可以让子串从pos的位置开始查找
    j = 0;
    while (i < S.length && j < T.length)
    {
        if (S.ch[i] == T.ch[j])//逐字符比较
        {
            printf("%c", S.ch[i]);//输出每次比较的字符
            ++i;
            ++j;
        }
        else
        {
            printf("%c", S.ch[i]);
            i = ++ pos;//比较不成功则模式串起始位置后移
            j = 0;
        }
    }
    if (j == T.length)
    {
        return pos;
    }
    else
    {
        return -1;
    }
}
int main()
{
    SString S, T;
    int k;
    int i;
    for (i = 0; i < 3; i++)
    {
        scanf("%s %s", S.ch, T.ch);
        S.length = strlen(S.ch);
        T.length = strlen(T.ch);
        k = index_BF(S, T, 0);//调用BF函数,默认从第1位开始比较,默认pos为0
        printf("\n");//每次换一行
        printf("%d\n", k + 1);
    }
    return 0;
}

运行实例

在这里插入图片描述
在这里插入图片描述

祝大家顺利完成

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dr.Water

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

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

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

打赏作者

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

抵扣说明:

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

余额充值