字符串的模式匹配

利用串的堆顺序存储,

typedef struct{

   char *ch;      //若串非空,则按串长分配存储区,

                  //否则ch为NULL

   int  length;   //串长度

}HString;

1)编写完成下列功能的函数:(1)创建一个串;(2)实现BF模式匹配算法;(3)实现KMP模式匹配算法;(4)调用创建串函数创建主串和模式串;(5)调用BF算法输出匹配结果;(6)调用KMP算法输出匹配结果;

2)用主函数调用你所编写的函数,并在每一步后有适当的输出,以验证你编程序的正确性。

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

typedef struct {
    char *ch;      // 若串非空,则按串长分配存储区, 否则ch为NULL
    int length;    // 串长度
} HString;

// 创建一个串
void createString(HString *s, const char *str) {
    s->length = strlen(str);
    s->ch = (char *)malloc((s->length + 1) * sizeof(char));
    strcpy(s->ch, str);
}

// 释放串的内存
void destroyString(HString *s) {
    if (s->ch != NULL) {
        free(s->ch);
        s->ch = NULL;
    }
    s->length = 0;
}

// 实现BF模式匹配算法
int BFMatch(const HString *mainStr, const HString *pattern) {
    int i = 0, j = 0;
    while (i < mainStr->length && j < pattern->length) {
        if (mainStr->ch[i] == pattern->ch[j]) {
            i++;
            j++;
        } else {
            i = i - j + 1;
            j = 0;
        }
    }
    if (j >= pattern->length) {
        return i - pattern->length;  // 返回匹配的起始位置
    } else {
        return -1;  // 未找到匹配
    }
}

// 实现KMP模式匹配算法(构建部分匹配表)
void getNext(const HString *pattern, int next[]) {
    int i = 0, j = -1;
    next[0] = -1;
    while (i < pattern->length - 1) {
        if (j == -1 || pattern->ch[i] == pattern->ch[j]) {
            i++;
            j++;
            next[i] = j;
        } else {
            j = next[j];
        }
    }
}

// 实现KMP模式匹配算法
int KMPMatch(const HString *mainStr, const HString *pattern) {
    int i = 0, j = 0;
    int next[pattern->length];
    getNext(pattern, next);
    while (i < mainStr->length && j < pattern->length) {
        if (j == -1 || mainStr->ch[i] == pattern->ch[j]) {
            i++;
            j++;
        } else {
            j = next[j];
        }
    }
    if (j >= pattern->length) {
        return i - j;  // 返回匹配的起始位置
    } else {
        return -1;  // 未找到匹配
    }
}

int main() {
    HString mainString, patternString;

    createString(&mainString, "ABABCABAB");
    createString(&patternString, "ABAB");

    printf("主串: %s\n", mainString.ch);
    printf("模式串: %s\n", patternString.ch);

    // 使用BF算法查找匹配
    int bfMatchPos = BFMatch(&mainString, &patternString);
    if (bfMatchPos != -1) {
        printf("BF算法:匹配成功,位置:%d\n", bfMatchPos);
    } else {
        printf("BF算法:未找到匹配\n");
    }

    // 使用KMP算法查找匹配
    int kmpMatchPos = KMPMatch(&mainString, &patternString);
    if (kmpMatchPos != -1) {
        printf("KMP算法:匹配成功,位置:%d\n", kmpMatchPos);
    } else {
        printf("KMP算法:未找到匹配\n");
    }

    destroyString(&mainString);
    destroyString(&patternString);

    return 0;
}

此代码包括创建串、BF模式匹配算法和KMP模式匹配算法的实现。在主函数中,我们创建了主串和模式串,然后使用BF算法和KMP算法查找匹配,并输出结果。确保在使用完字符串后释放内存以防止内存泄漏。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值