新手易懂的BF算法进行串匹配(蛮力法 C/C++)

应用蛮力法解决串匹配问题的过程是:从主串S的第一个字符开始和子串T第一个字符进行比较,若相等,则主串子串往后移一个字符进行比较;若不相等,则从主串的第二个字符开始和子串的第一个字符重新开始比较,重复上诉过程,若子串T中的字符全部比较完毕,则说明本趟匹配成功;否则不成功。这个算法称为朴素的模式匹配算法,简称BF算法。

设主串S="abcabcacb",子串T="abcac",BF算法的匹配过程如图所示。

新手易懂的BF算法进行串匹配(蛮力法 C/C++)_第1张图片


伪代码描述如下:

输入:主串S,子串T

输出:T在S中的位置

1.初始化主串比较的开始位置index=0;

2.在串S和串T中设置比较的起始坐标i=0,j=0;

3.重复下述操作,直到S或T的所有字符均比较完毕:

    3.1 如果S[i]=T[j],则继续比较S和T的下一对字符

    3.2 否则,下一趟匹配的开始位置index++,主串回溯下标i=index,子串回溯下标j=0;

4.如果T中所有字符均比较完了,则返回匹配的开始位置index;否则返回0;

C语言代码如下所示:

#include 
int BF(char S[],char T[])
{
    int index=0;
    int i=0;
    int j=0;
    while(S[i]!='\0'&&T[j]!='\0')
    {
        if(S[i]==T[j])
        {
        //如果匹配成功,则继续比较下一对字符
            i++;
            j++;
        }
        else
        {
          //如果匹配不成功,主串和子串回溯坐标。index记录的是每次匹配时的开始位置
            index++;
            i=index;
            j=0;
        }
    }
    if(T[j]=='\0') return index+1;
    else return 0;
}
int main()
{
    char a[30];
    gets(a);
    char b[10];
    gets(b);
    printf("匹配的开始位置是:%d",BF(a,b));
    return 0;
}

C++代码如下:

#include 
#include 
using namespace std;
int BF(string S,string T)
{
    int index=0;
    int i=0;
    int j=0;
    while(S[i]!='\0'&&T[j]!='\0')
    {
        if(S[i]==T[j])
        {
            i++;
            j++;
        }
        else
        {
            index++;
            i=index;
            j=0;
        }
    }
    if(T[j]=='\0') return index+1;
    else return 0;
}
int main()
{
    string A;
    cin>>A;
    string B;
    cin>>B;
    cout<<"匹配的开始位置是:"<
新手易懂的BF算法进行串匹配(蛮力法 C/C++)_第2张图片


你可能感兴趣的:(算法)