模式匹配之BF(Brute Force)暴力算法

 模式匹配即子串定位,是查找子串在主串中第一次出现的位置的过程,查找成功则返回改位置,否则返回-1  
匹配过程是怎么样的呢?
   首先比较主串和子串中第一个位置的字符(i,j分别表示主串,子串中的位置),所以初始化i=1,j=1;如果该字符相等,则继续比较两串中下一位置的字符,否则i回溯到上次开始比较的位置的下一位置,j回溯到1,继续进行上面的比较,当扫描其中任何一个串时则结束循环,如果j=t[0]+1,匹配成功

    光这么说可能不太清楚明了,看图  

这里写图片描述

以下是代码:
/*
模式匹配之BF(Brute Force)暴力算法
*/
# include<iostream>
# include<string>

using namespace std;

int patternMatch_BF(string s,string t);
int main()
{
    string s;
    string t;

    cout << "请输入主串:";
    cin >> s;
    cout << "请输入子串:";
    cin >> t;

    int result = patternMatch_BF(s, t);
    if (result==-1)
        cout <<endl<< "匹配失败" << endl;
    else cout << endl<<"子串在主串中的位置为:" << result << endl;
    return 0;
}

int patternMatch_BF(string s, string t)//返回子串t在串s第一次出现的位置(从1开始),若t不是s的子串
                                    //返回-1
{
    int i = 1, j = 1;
    while (i <=s.length()&& j <=t.length())//两个串都没扫描完
    {
        if (s[i-1] == t[j-1])//该位置上字符相等,就比较下一个字符
        {
            i++;
            j++;
        }
        else
        {
            i = i - j + 2; //否则,i为上次扫描位置的下一位置
            j = 1; //j从1开始
        }

    }
    if (j > t.length())
        return (i - t.length());
    return -1;
}

这里写图片描述

 虽然黑猫白猫能捉到老鼠就是好猫,但是,算法嘛,肯定是注重效率的,来看看BF算法的时间复杂度:
  在匹配成功的情况下,考虑两种极端情况,
   1):最好情况下:
           每次匹配不成功都发生在第一对字符比较时(比如s:"12121212345",    
           t"345"),假设匹配成功发生在s的第i个字符处,则前面i次匹配中一共
           比较了i-1次,第i次比较了m(子串t的长度)次,所以共比较了i+m-1次,
           所有匹配成功的可能共有n-m+1种(n为主串s的长度),在每种匹配成功的              
           概率相等的情况下,p=1/(n-m+1)
           所以最好情况下,平均比较的次数为:
            p*(1+m-1)+p*(2+m-1)+...+p*(n-m+1 +m-1)
  化简后得到结果为(n+m)/2
      ***所以最好情况下时间复杂度为O(n+m)***

2)最坏情况下:

   每次匹配不成功都发生在t的最后一个字符比较处(比如
   s:"343434345",t:"345")


   设匹配成功发生在s的第i个字符处,那么前面i-1次比较共比较了(i-
   1)*m次,第i次成功的匹配比较了m次,所以总共比较了i*m次,所以最坏情况下平
   均比较次数为:
p*(1*m)+p*(2*m)+...+(i*m)=(m*(n-m+2))/2

所以,最坏情况下时间复杂度为O(n*m)(认为m比n要小得多,所以忽略了m*m)

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值