首页 > 编程语言 >串的模式匹配(BF算法)

串的模式匹配(BF算法)

时间:2023-04-18 16:34:57浏览次数:31  
标签:BF SqString int 样例 char 算法 str data 模式匹配

【问题描述】

串的模式匹配算法BF的实现与应用。

【输入形式】

第一行输入主串s;

第二行输入模式串t;

输入串中均不包含空格字符。

【输出形式】

模式串在主串s中的出现的每一个位置序号。若一次都未匹配到,则输出0。

【样例输入1】

ababcabcacbab

ab

【样例输出1】

1 3 6 12

【样例输入2】

111113455113232342432432

11

【样例输出2】

1 2 3 4 10

【样例输入3】

fasdfdsfsadfdsdsagetgrdgfdgdf

2312

【样例输出3】

0

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
 
#define INITSIZE 1000
#define INCRE 20
#define OK 1
#define ERROR 0
 
typedef struct{
  char* data;
  int length,stringsize;
}SqString;
 
//串初始化
int initString(SqString *S){
  S->data=(char *)malloc(INITSIZE*sizeof(char));
  if(!S->data)
    return 0;
  S->length=0;
  S->stringsize=INITSIZE;
  return 1;
}
 
//串赋值
int strAssign(SqString *s, char *str ){
    int i=0;
    while(*str)
        s->data[i++]=* str++;
    s->data[i]='\0';
    s->length=i;
    return 1;
}
//基本模式匹配算法
int index_bf(SqString *s,SqString *t,int start)
{
    int i=start-1,j=0;
    while(i<s->length&&j<t->length)   //依次比较主串s和子串t对应字符
        if(s->data[i]==t->data[j])   //对应字符相等,继续比较下一个字符
        {
            i++;
            j++;
        }
        else          //对应字符不相等,i和j回溯,开始下一趟比较
        {
            i=i-j+1;
            j=0;
        }
    if(j>=t->length)     //匹配成功,返回子串 t 在主串 s 中的位置
        return i-t->length+1;
    else
        return 0;
 
 
}
int main(){
       //利用模式匹配算法完成子串查找
 SqString S;
 SqString T;
    int pos=1,tmp=0;
    char str[1000];
    if(initString(&S)&&initString(&T))
    {
        scanf("%s",&str);
        strAssign(&S,&str[0]);
        scanf("%s",&str);
        strAssign(&T,&str[0]);
        while(pos<S.length)
        {
            pos=index_bf(&S,&T,pos);
            if(pos==0)break;
            printf("%d ",pos);
            tmp=1;
            pos++;
        }
        if(!tmp)printf("0");
        printf("\n");
    }
    return 0;
}

标签:BF,SqString,int,样例,char,算法,str,data,模式匹配
From: https://blog.51cto.com/u_16030624/6203654

相关文章

  • 基于GOA蚱蜢优化算法的KNN分类器最优特征选择matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要       蝗虫优化算法(GrasshopperOptimizationAlgorithm,GOA)是一种新型的元启发式算法,由Mirjalili等人于2017年提出。该算法受幼虫和成年蝗虫大范围移动与寻找食物源的聚......
  • 实际问题中用到的算法——递归算法确定插帧顺序
    问题:现在需要给一个视频序列插帧,插帧算法要求每次只能由两帧输入插值得到其中间帧。如果现在需要给一个视频做4倍(或者更高的8,16倍等类似)的插帧,则一个插帧的思路是当前视频每相邻帧之间插入3帧,即:假设插帧前视频帧序号是0,4,8,12…,则插帧时补充相邻帧跨过的3个序号,得到插......
  • 大数据的快速崛起,离不开数据、区块链和算法的支持
    事实上,自2001年来,大数据已然呈现出爆炸式增长。经过多年发展,大数据的应用已经帮助我们开发了更多、更高端的技术在我们的工作、生活中。与此同时,大数据也衍生出了其他技术,比如人工智能、机器学习等。那么,放眼未来,大数据又将如何开启新征程?1.通过数据,更好赋权这个意思就是我们应该给......
  • 26、字符串匹配 KMP 算法
    1、KMP算法的基本原理2、KMP算法的正确性证明3、什么是LPS数组4、LSP数组的计算5、实现LPS数组6、KMP算法的实现7、复杂度分析......
  • 密码引擎-4-国䀄算法交叉测试
    实验一密码引擎-4-国䀄算法交叉测试02人一组,创建一个文件,文件名为小组成员学号,内容为小组成员学号和姓名1在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码和运行结果截图2在Ubuntu中基于OpenSSL产生一对公私钥对(SM2算法)在安装了正确版本的openss......
  • 实验一 密码引擎-4-国䀄算法交叉测试
    实验一密码引擎-4-国䀄算法交叉测试1在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码和运行结果截图2在Ubuntu中基于OpenSSL产生一对公私钥对(SM2算法)3.在Ubuntu中使用OpenSSL用SM3算法计算上述文件的Hash值,然后用OpenSSLSM2算法计算Hash值的......
  • 实验一 密码引擎-4-国䀄算法交叉测试
    实验一密码引擎-4-国䀄算法交叉测试目录1在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码和运行结果截图2在Ubuntu中基于OpenSSL产生一对公私钥对(SM2算法)2.1创建EC参数和原始私钥文件2.2将原始的私钥文件,转换为pkcs8格式:2.3利用原始的私钥,生......
  • 实验一 密码引擎-4-国䀄算法交叉测试
    02人一组,创建一个文件,文件名为小组成员学号,内容为小组成员学号和姓名1在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码和运行结果截图2在Ubuntu中基于OpenSSL产生一对公私钥对(SM2算法)3在Ubuntu中使用OpenSSL用SM3算法计算上述文件的Hash值,然后用Ope......
  • 实验一 密码引擎-4-国密算法交叉测试
    02人一组,创建一个文件,文件名为小组成员学号,内容为小组成员学号和姓名1在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码和运行结果截图2在Ubuntu中基于OpenSSL产生一对公私钥对(SM2算法)3在Ubuntu中使用OpenSSL用SM3算法计算上述文件的Hash值,然后用Ope......
  • 2023-04-17 算法面试中常见的树和递归问题
    二叉树和递归0LeetCode297二叉树的序列化和反序列化序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与......