C++实现:BF算法和KMP算法

本文详细介绍了两种经典的字符串匹配算法——BF算法和KMP算法。通过对比两种算法的实现方式,展示了KMP算法如何通过预处理模式串来提高搜索效率,避免了BF算法中的大量重复比较。
BF算法:
int BF_Find(string& s,string& t)
{
	int i=0,j=0,count=0;
	while(i<s.size())
	{
		
		if(s.at(i)==t.at(j))
		{
			i++;
			j++;
			count++;}
	   else
	   {
		   i++;
		   j=0;
		   count=0;
		}
		if(count==t.size())
		{
			cout<<"模式匹配成功,起始位置是:"<<i-count+1<<endl;
			return (i-count+1);
		}
	   
	}
    cout<<"字符串匹配失败!"<<endl;
	return 0;
}


改进后的BF算法效率更高即KMP算法:

void GetNext(string& s,int *next)
{
	int len = s.size();
     next[0] = 0;
     next[1] = 0;
     int i = 1;
     while(i < len - 1)
    {
            int j = next[i];

			while(j > 0 && s.at(j) != s.at(i)) j = next[j];

			if(s.at(j) == s.at(i))  next[i + 1] = j + 1;
            else next[i + 1] = j;

            i++;
      }



}

int KMP_Find(string& s,string&t) {  int i=0,j=0;  int n =t.size();  int *next = new int[n];  GetNext(t,next);  while(i<s.size()&&j<t.size())   {      if((j == 0)||(s.at(i)==t.at(j)))               {       i++;                   j++;               }               else               {                   j = next[j];               }    }

  if(j==t.size())   {    int index=i-t.size()+1;    cout<<"子串从长串的第"<<index<<"位开始匹配成功!"<<endl;     return index;   }      cout<<"字符串匹配失败!"<<endl;   return 0; }

测试代码:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std; 
int _tmain(int argc, _TCHAR* argv[])
{
	string str1,str2;
	cout<<"请输入主串:"<<endl;
	cin>>str1;
	cout<<"请输入子串:"<<endl;
	cin>>str2;
	KMP_Find(str1,str2);
	return 0;
}


 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值