最简单模式匹配算法——BF算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JEYMING/article/details/80069302
/*
    串的匹配算法
    2018.04.24
*/
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std;

#define MAXSIZE 100 //串的最大长度
#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef int Status;

//静态的,编译时确定了串的空间大小;
typedef struct{
    //从下标1的数组分量中开始存储,下标0闲置不用
    char ch[MAXSIZE+1]; //存储串的一维数组
    int length; //串的当前长度
}SString;

//最简单模式匹配算法
//BF算法
//算法步骤:
//1.分别利用计数指针i和j指示主串S和模式T中当前正待比较的字符位置,i的初值为pos,j的初值为1;
//2.如果两个串均为比较到串尾,即i和j均分别小于等于S和T的长度时,则循环执行以下操作:
//    *S.ch[i]和T.ch[j]比较,若相等,则i和j均分别指示串中下位置,继续比较后续字符;
//    *若不相等,指针后退重新开始匹配,从主串的下一个字符(i=i-j+2)起再重新和模式的第一个字符(j=1)匹配;
//3.如果j>T.length,说明模式T中的每个字符一次和主串S中的一个连续的字符序列相等,在匹配成功,返回和模式T中第一个字符相等的字符在主串S中的序号;否则称匹配不成功,返回0;

int IndexBF(SString S,SString T,int pos){
    int i=pos;
    int j=1;    //初始化
    while(i<=S.length&&j<=T.length){ //两个串均未到串尾
        if(S.ch[i]==T.ch[j]){
            ++i;
            ++j;    //继续比较后续字符
        }
        else{
            i=i-j+2;
            j=1;    //指针后腿重新开始匹配
        }
    }
    if(j>T.length)
        return i-j+1;   //匹配成功
    else 
        return 0;       //匹配失败
}

int main(){
    SString S,T;
    int sum=0;
    cout<<"1.sum=";
    cin>>sum;
    for(int i=1;i<=sum;++i){
        cout<<"S.ch["<<i<<"]:";
        cin>>S.ch[i];
    }
    S.length=sum;
    cout<<endl;
    cout<<"2.sum=";
    cin>>sum;
    for(int i=1;i<=sum;++i){
        cout<<"T.ch["<<i<<"]:";
        cin>>T.ch[i];
    }
    T.length=sum;
    int pos=0;
    cout<<"pos:";
    cin>>pos;
    cout<<"the ch in "<<IndexBF(S,T,pos)<<endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/JEYMING/article/details/80069302
今日推荐