字符串匹配的BF算法

已知两个字符串,一个主串S,一个子串T,求子串在主串中是否出现。如果出现,输出子串在主串中的位置。

利用暴力求解算法,每次比较主串和子串中的一个字符是否相等,如果相等,两个串的下标均后移。如果不相等,子串下标回到零,主串下标回到上一次开始比较的下一个位置。也就是说,每匹配失败一次,子串相对主串只移动一个字符的位置。在最好的情况下,该算法的时间复杂度为O(m+n),在最坏的情况下,时间复杂度为O(m*n)。因此,该算法只适合求长度较短的字符串,如果主串和子串过长,很有可能会超时。

#include <iostream>
#include<cstdio>
#include<cstring>

using namespace std;

int BF(char s[100],char t[10],int m)//m是指从主串下标为m的位置开始进行匹配
{
    int i=m,j=0;
    int lens=strlen(s),lent=strlen(t);
    while(i<lens&&j<lent)
    {
        if(s[i]==t[j])
        {
            i++;
            j++;
        }
        else
        {
            j=0;
            i=i-j+2;
        }
    }
    if(j==lent)
    {
        return i-j;
    }
    else
        return 0;
}
int main()
{
     char s[100];
     char t[10];
     gets(s);
     gets(t);
     int n;
     scanf("%d",&n);

     int ans=BF(s,t,n);
     if(ans==0)
        printf("匹配失败\n");
     else
     {
         printf("%d\n",ans);
     }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值