朴素的模式串匹配算法——BF算法

西安电子科技大学数据结构上机实验

//
// Created by 王文轩 on 2022/10/29.
//
# include "stdlib.h"
# include "stdio.h"
# include "string.h"

# define maxsize 1024
# define LEN sizeof(struct seqstring)

struct seqstring {
    
    
    char ch[maxsize];
    int len;
};

// 开辟字符串的函数:
struct seqstring *makestr();

// 顺序串朴素匹配:
int match(struct seqstring *, struct seqstring *, int *, int *);

int main(void) {
    
    
    struct seqstring *tString, *pString;
    int cnt = 0, pos = 0;

    printf("******请输入目标串: ");
    tString = makestr();
    printf("******请输入模式串: ");
    pString = makestr();

    if (match(tString, pString, &cnt, &pos)) {
    
    
        printf("匹配成功!比较次数为%d\n", cnt);
        printf("返回第一次匹配成功的位置(首字母位序):%d\n", pos);
    } else {
    
    
        printf("匹配失败!比较次数为%d\n", cnt);
    }
}

struct seqstring *makestr() {
    
    
    struct seqstring *string = (struct seqstring *) malloc(LEN);
    scanf("%s", string->ch);
    string->len = strlen(string->ch);
    return string;
}

int match(struct seqstring *t, struct seqstring *p, int *cnt, int *pos) {
    
    
    int i = 1, j = 1;
    while (i <= t->len && j <= p->len) {
    
    
        if (t->ch[i - 1] == p->ch[j - 1]) {
    
    
            i++;
            j++;
        } else {
    
    
            i = i - j + 2;
            j = 1;
        }
        (*cnt)++;
    }
    if (j > p->len) {
    
    
        *pos = i - p->len;
        return 1;
    }
    return 0;
}

/*
测试用例 1:
输入:
T:abcababcabc
P:abcabc
输出:
匹配成功! 比较次数为: 18
返回第一次匹配成功的位置(首字母位序): 6

测试用例 2:
输入:
T:abcababcabckka
P:abcabc
输出:
匹配成功! 比较次数为: 18
返回第一次匹配成功的位置(首字母位序): 6

测试用例 3:
输入:
T:abcababcabckka
P:abcabd
输出:
匹配失败! 比较次数为: 29

测试用例 4:
输入:
T:aaaaaaaaaaaaaaaaaaakuu
P: aaaaak
输出:
匹配成功! 比较次数为: 90
返回第一次匹配成功的位置(首字母位序): 15

测试用例 5:输入:
T:aaaaaaaaaaaaaaaaaaak
P:aaaaau
输出:
匹配失败! 比较次数为: 105
 */

猜你喜欢

转载自blog.csdn.net/wwx1239021388/article/details/129392841