首页 > 编程语言 >数据结构题目:模式匹配的BF算法

数据结构题目:模式匹配的BF算法

时间:2024-07-07 10:27:38浏览次数:20  
标签:主串 BF 匹配 函数 模式 算法 数据结构 模式匹配

1、实验目的

键盘输入目标串(主串)s、模式串(子串)t,编写程序,实现顺序串的BF模式匹配算法。

2、实验具体要求

匹配成功,输出位序,匹配不成功,显示相应提示信息。

例如:s=“aababcdcccc”,t=“bcd”。

3、实验设计思路(编程语言、模块划分及函数功能描述等)

模块划分及函数功能描述:

(1)主程序模块(main函数):负责程序的整体流程控制,包括接收用户输入、调用BF算法进行模式匹配,以及输出结果。

(2)BF算法模块(BF_Search函数):包含BF模式匹配算法的实现,接收主串和模式串作为参数,返回模式串在主串中的起始位置(如果找到)或-1(如果未找到)。

(3)main函数

功能:程序入口点,负责程序的初始化、输入接收、算法调用和结果输出。

流程:使用printf函数提示用户输入主串和模式串。使用fgets函数从标准输入读取主串和模式串,并去除字符串末尾的换行符。调用BF_Search函数进行模式匹配。根据BF_Search函数的返回值输出结果。

(4)BF_Search 函数

流程:使用strlen函数获取主串和模式串的长度。使用两个指针i和j分别指向主串和模式串的当前字符。在主串未遍历完且模式串未匹配完的情况下进行循环。如果当前字符匹配,则两个指针都向后移动一位。如果当前字符不匹配,则将主串指针回溯到模式串长度的下一个位置,模式串指针重置为0。如果模式串匹配完(即j等于模式串长度),则返回主串指针当前位置减去模式串长度(即模式串在主串中的起始位置)。如果主串遍历完仍未找到匹配,则返回-1表示未找到。

4、实验源程序、程序调试结果

源程序:

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

// BF模式匹配算法  
int BF_Search(char* s, char* t) {
    int i = 0, j = 0;
    int s_len = strlen(s);
    int t_len = strlen(t);

    while (i < s_len && j < t_len) {
        if (s[i] == t[j]) {
            i++;
            j++;
        }
        else {
            i = i - j + 1; // 移动主串指针到模式串的下一个字符开始位置  
            j = 0; // 重置模式串指针  
        }
    }

    if (j == t_len) {
        // 匹配成功,返回模式串在主串中的起始位置  
        return i - j;
    }
    else {
        // 匹配失败  
        return -1;
    }
}

int main() {
    char s[100], t[100];

    // 从键盘读取主串和模式串  
    printf("请输入主串s: ");
    fgets(s, sizeof(s), stdin); // 注意fgets会读取换行符,如果需要去除可以在后面处理  
    s[strcspn(s, "\n")] = 0; // 去除字符串末尾的换行符  

    printf("请输入模式串t: ");
    fgets(t, sizeof(t), stdin);
    t[strcspn(t, "\n")] = 0; // 去除字符串末尾的换行符  

    // 调用BF_Search函数进行匹配  
    int pos = BF_Search(s, t);

    if (pos != -1) {
        // 匹配成功  
        printf("模式串在主串中的位序为: %d\n", pos);
    }
    else {
        // 匹配失败  
        printf("模式串在主串中未找到\n");
    }

    return 0;
}

调试结果:

匹配成功:

匹配不成功:

5、程序调试过程中遇到的问题及解决办法

(1)出现缺少“scanf_s”的整型参数的问题。因为没有传入字符串长度的参数,所以出现此问题。需要提供一个数字以表明最多读取多少位字符,同时提高了安全性。

(2)对字符的长度掌控不到位,范围给的太小了。改变字符串的长度范围,使输入的字符串都能显示出来。

6、实验收获与体会

(1)了解和掌握了在顺序串上实现串的基本运算算法和串的简单模式匹配Brute—Force算法。

(2)通过反复的尝试,发现该算法思路简单,但在最坏时间的复杂程度很高,比较次数较多,所以探究新的方法KMP算法,尝试多种的可能性。

原创作品,感谢各位比奇堡居民的支持!!!

标签:主串,BF,匹配,函数,模式,算法,数据结构,模式匹配
From: https://blog.csdn.net/weixin_74992173/article/details/140228126

相关文章

  • 数据结构——(双)链表
    文章目录1. 定义2. 双链表和单链表的区别3.代码示例3.1双链表节点和结构定义3.2初始化双链表3.3 返回双链表的长度3.4 在指定位置插入元素3.5 在末尾插入元素3.6 删除指定位置的元素并返回被删除的元素3.7 删除末尾元素3.8获取指定位置的元素3.9修改指......
  • 数据结构——单向循环链表
    文章目录1.概念2. 区别2.1结构区别2.2访问方式区别2.3优缺点对比3.流程4. 基本操作5.代码示例1.概念单向循环链表是一种特殊的单链表,其中最后一个节点的后继指针指向头节点,形成一个环。单向循环链表适合用于需要循环访问数据的场景,如约瑟夫环问题。节点......
  • 数据结构小学期第六天
    今天完全实现了九宫格拼图游戏,具备一键通关功能按下W键,查看原图功能按住A键不松,移动图片按上下左右键,如果你自己想要实现这个功能,需要自己的图片,图片格式要求。每个小图片是105*105,完整图片是315*315.有人想要做一下,可以试一试。代码如下启动类1importcom.itheima.ui.GameJ......
  • 【数据结构】栈和队列
    文章目录1.栈1.1栈的概念及结构1.2栈的实现2.队列2.1队列的概念及结构2.2队列的实现3.栈和队列面试题4.概念选择题1.栈1.1栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈......
  • 一种尽可能减小内存占用的数据结构设计方法
         背景:以三维点为例,随着采集设备的日新月异,三维点的属性信息也越来越多(例如颜色、强度、回波信息、gps时间等);导致点云数据在处理时加载到计算机中所需要的内存空间也越来越大,但是有些数据往往只有x、y、z三个坐标值,则不需要为其开辟多余的内存空间,那一套统一的数据结......
  • pwn的linux基础(计算机内部数据结构存储形式)
    linux基础保护层级:分为四个ring0-ring3一般来说就两个,0和30为内核3为用户 权限:用户分为多个组文件和目录等等的权限一般都是三个,即可读可写可执行。读:R,写:W,执行:X赋予一个可执行文件执行权限就是chmod+xfilename虚拟内存和物理内存:物理内存很直白,就是内存......
  • 【教程】一步一步构建一个RBF神经网络-详细解说
    本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/目录一、什么是RBF神经网络1.1.RBF神经网络介绍二、matlab实现RBF神经网络2.1.matlab实现RBF代码示例2.2.代码解说一、什么是RBF神经网络1.1.RBF神经网络介绍RBF神经网络是指使用RBF作为激活函数......
  • python数据结构(树和二叉树)
    树非线性结构一对多根结点(无前驱)多个叶子结点(无后继)其他数据元素(一个前驱,多个后驱)树与二叉树转换树与二叉树均可用二叉链表作为存储结构,则以二叉链表为媒介可导出树之间的一个对应关系-----即给定一颗树,可以找到唯一一颗二叉树与之对应。把树转化为二叉树步骤一:加线......
  • Redis数据结构-字典的实现
    字典,又称符号表(symboltable)、关联数组(associativearray)或者映射(map),是一种用于保存键值对(key-valuepair)的抽象数据结构。在字典中,一个键(key)可以和一个值(value)进行关联(或者说将键映射为值),这些关联的键和值就被称为键值对。字典中的每个键都是独一无二的,程序可以在字典......
  • 从零开始学数据结构系列之第四章《 广度优先遍历BFS》
    文章目录广度优先遍历(BFS)概念广度优先遍历算法步骤总代码往期回顾广度优先遍历(BFS)概念​  广度优先遍历(BreadthFirstSearch),又称为广度优先搜索,简称BFS。​  如果说图的深度优先遍历类似树的前序遍历,那么图的广度优先遍历就类似于树的层序遍历了。​ ......