BF算法(具体应用)

简介: 模式匹配算法

BF算法的概念

1.逻辑概念

BF算法又称模式匹配基本算法,该算法的基本思想是,按照自左向右的顺序,从主串的第start个字符起和模式串的第一个字符比较,若相等,则继续逐个比较后续字符;否则从主串的第start+1个字符起重新和模式串的字符比较。以此类推,直到模式串t中的每个字符依次和主串s中的一个连续的字符序列相等,则匹配成功,否则匹配失败,下面我们来看BF算法的代码表示

2.代码实现

int Index_String(PString S1,PString S2,int start){  //S1是主串,S2是子串,start是起始位置
    int i=start-1,j=0;        
    while(i<S1->len&&j<S2->len){   //模式匹配
        if(S1->data[i]==S2->data[j]){   //当主串元素和子串相等时,继续判断
            i++;
            j++;
        }else{       //只要遇到子串与主串不同的元素,就使主串回到判断起始位置的后一个位置
            i=i-j+1;        //重新开始匹配
            j=0;
        }
    }
    if(j>=S2->len){      //当j大于了子串的长度,说明匹配成功了,返回子串在主串出现的第一个位置
        return i-S2->len+1;
    }else{               //否则返回0
        return 0;
    }
}

BF算法的应用

1.输出子串在主串中的位置

问题描述

【问题描述】
串的模式匹配算法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

算法思想

对于这个问题,我们使用BF算法来解决的时候,只需要在主函数中循环判断,每次找到一个位置,下次就从该位置后面开始,继续找,直到主串都循环完即可,下面我们来看具体的代码实现

完整代码

这里主要运用了串的初始化,串的赋值以及BF算法

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define SIZE 10
#define INCREAM 10
typedef struct String{    //结构体
    char *data;
    int len;
    int size;
}String,*PString;
int Init_String(PString S){    //初始化串
    S->data=(char *)malloc(sizeof(char)*SIZE);
    S->len=0;
    S->size=SIZE;
    return 1;
}
int Creat_String(PString S,char *s){   //给串赋值(创建串)
    int i=0,n;
    if(S->size<strlen(s)){     //先判断串的空间是否足够,不够要重新开辟空间
        S->data=(char *)realloc(S->data,(S->size+INCREAM)*sizeof(char));
        S->size+=INCREAM;
    }
    n=strlen(s);   
    for(i=0;i<n;i++){      //给串赋值
        S->data[i]=*s++;
    }
    S->len=n;       //最后别忘了串是有长度的
    return 1;
}
int Index_String(PString S1,PString S2,int start){   //BF算法
    int i=start-1,j=0;
    while(i<S1->len&&j<S2->len){
        if(S1->data[i]==S2->data[j]){
            i++;
            j++;
        }else{
            i=i-j+1;
            j=0;
        }
    }
    if(j>=S2->len){
        return i-S2->len+1;
    }else{
        return 0;
    }
}
int Print_String(PString S){  //打印串
    int i;
    for(i=0;i<S->len;i++){
        printf("%c",S->data[i]);
    }
    printf("\n");
    return 1;
}
int main(){
    char s1[100],s2[100];
    int x;
    String S1,S2;
    Init_String(&S1);
    Init_String(&S2);
    gets(s1);
    gets(s2);
    Creat_String(&S1,s1);
    Creat_String(&S2,s2);
    x=Index_String(&S1,&S2,1);   //我们先看主串有没有子串
    if(x==0) printf("0");
    while(x!=0){      //当获取到的位置返回值不是0时,继续循环
        printf("%d ",x);    //打印位置
        x=Index_String(&S1,&S2,x+1);    //从该位置后面一个位置继续下一次判断
    }
    return 0;
}

运行结果

1.png

2.删除主串中的所有子串

问题描述

【问题描述】编写一个程序,当在一个字符串中出现子串时就删除它(字符串的字符个数不超过1000)。
【输入形式】第一行输入一个字符串,第二行输入一个子串。
【输出形式】程序在下一行输出删除其中所有子串后的字符串。如果字符串不包含子串则输出原字符串本身。
【样例输入1】
I am a boy!
a
【样例输出1】
I m boy!
【样例输入2】
Ah Love!could you and I with Fate conspire
ould
【样例输出2】
Ah Love!c you and I with Fate conspire
【样例说明】
删除第一个字符串中所有的子串,包括连续出现的子串。

算法思想

在主串中删除子串,运用BF算法找到子串在主串的位置,然后通过子串的长度,我们执行删除操作,一直循环,直到把子串全部删除为止 ,下面我们来看具体的代码实现

完整代码

这里串的初始化,串的赋值,BF算法都和之前一样,我们具体说一下删除子串的算法

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define SIZE 10
#define INCREAM 10
typedef struct String{     //结构体
    char *data;
    int len;
    int size;
}String,*PString;
int Init_String(PString S){
    S->data=(char *)malloc(sizeof(char)*SIZE);
    S->len=0;
    S->size=SIZE;
    return 1;
}
int Creat_String(PString S,char *s){
    int i,n;
    n=strlen(s);
    for(i=0;i<n;i++){
        if(S->size<strlen(s)){
            S->data=(char *)realloc(S->data,(S->size+INCREAM)*sizeof(char));
            S->size+=INCREAM;
        }
        S->data[i]=*s++;
    }
    S->len=n;
    return 1;
}
int Index_String(PString S1,PString S2,int start){
    int i=start-1,j=0;
    while(i<S1->len&&j<S2->len){
        if(S1->data[i]==S2->data[j]){
            i++;
            j++;
        }else{
            i=i-j+1;
            j=0;
        }
    }
    if(j>=S2->len){
        return i-S2->len+1;
    }else{
        return 0;
    }
}
int Print_String(PString S){
    int i;
    for(i=0;i<S->len;i++){
        printf("%c",S->data[i]);
    }
    return 1;
}
int Delete_String(PString S1,PString S2){   //删除子串的算法
    int x;
    int i,j;
    x=Index_String(S1,S2,1);    //先获得一个位置,如果为0,说明主串没有子串,返回0
    if(x==0) return 0;
    while(x!=0){      //否则,我们执行以下操作
        for(i=0;i<S2->len;i++){    //删除主串中的子串
            for(j=x-1;j<S1->len-1;j++){     //每次删除一个相同元素,执行次数为子串长度
                S1->data[j]=S1->data[j+1];
            }
            S1->len--;   //每删除一个元素,主串长度减少1
        }
        x=Index_String(S1,S2,1);   //重新获取位置,继续执行下一次判断
    }
    return 1;
}
int main(){
    char s1[100],s2[100];
    String S1,S2;
    Init_String(&S1);
    Init_String(&S2);
    gets(s1);
    gets(s2);
    Creat_String(&S1,s1);
    Creat_String(&S2,s2);
    Delete_String(&S1,&S2);
    Print_String(&S1);
    return 0;
}

运行结果

2.png

目录
相关文章
|
27天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
41 3
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的优化算法及其应用
【10月更文挑战第8天】 本文将探讨深度学习中常用的优化算法,包括梯度下降法、Adam和RMSProp等,介绍这些算法的基本原理与应用场景。通过实例分析,帮助读者更好地理解和应用这些优化算法,提高深度学习模型的训练效率与性能。
136 63
|
10天前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
20 0
|
21天前
|
存储 算法 搜索推荐
这些算法在实际应用中有哪些具体案例呢
【10月更文挑战第19天】这些算法在实际应用中有哪些具体案例呢
25 1
|
27天前
|
机器学习/深度学习 人工智能 算法
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
65 0
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
|
1月前
|
算法 安全 物联网
如何应用SM2算法进行身份认证
【10月更文挑战第5天】如何应用SM2算法进行身份认证
55 1
|
1月前
|
存储 算法 安全
SM2算法的应用场景有哪些?
【10月更文挑战第5天】SM2算法的应用场景有哪些?
64 1
|
1月前
|
存储 算法 安全
Python 加密算法详解与应用
Python 加密算法详解与应用
26 1
|
1月前
|
机器学习/深度学习 算法
深度学习中的优化算法及其应用
本文探讨了深度学习中常用的优化算法,包括梯度下降、随机梯度下降、动量方法和Adam方法。通过对比这些算法的优缺点及适用场景,帮助读者更好地理解和应用这些优化方法。
27 2
|
21天前
|
监控 算法 数据挖掘
HyperLogLog算法有哪些应用场景呢
【10月更文挑战第19天】HyperLogLog算法有哪些应用场景呢
14 0