串的模式匹配算法——BF算法(C++代码)

文章目录

  • 一. 具体思路
  • 二. C++代码实现
  • 三. BF算法分析
  • 四. 低效的原因
  • 五. 参考

子串的定位操作通常称作串的 匹配模式(其中P,T称为模式串,PaTtern),是各种串处理系统中最重要的操作之一。
在串的模式匹配中, 子串P称为模式,主串S称为目标

示例:

	目标S:"Beijing"
	模式P:"jin"
	匹配结果 = 3(匹配位置从0开始) 

Brute—Force 简称BF算法,亦称简单匹配算法。采用穷举的思想。

一. 具体思路

  1. 初始时让目标 S 的第 0 位与模式 P 的第 0 位对齐;
  2. 顺序比对目标 S 与模式 P 中的对应字符:
    ①. 若 P 与 S 比对发现对应位不匹配,则本趟失配。将 P 右移一位与 S 对齐,进行下一趟比对;
    ②. 若 P 与 S 对应位都相等,则匹配成功,返回 S 当前比较指针停留位置减去 P 的长度,即目标 S 中匹配成功的位置,算法结束;
    ③ 若 P 与 S 比对过程中, S 后面所剩字符个数少于 P 的长度,则模式匹配失败。
    串的模式匹配算法——BF算法(C++代码)_第1张图片

二. C++代码实现

#include
#include
using namespace std;
int index(string &S, string &P, int pos)
{//pos是从指定位置开始进行匹配 
	int i = pos, j = 0 ; 
	 //i代表主串当前待比较的位置,j代表子串当前待比较的位置 
	while(i<S.size() && j<P.size())
	{
		if(S[i] == P[j])
		{
			i++;       //若当前字符相同,则继续向下比较 
			j++;
		}
		else 		  //主串,子串指针回溯重新开始下一次匹配 
		{
			i=i-j+1;   //主串退回到开始匹配 
			j=0;      //子串从头开始匹配 
		}
	}
	if(j>=P.size() )
		return (i-P.size() );  //返回匹配的第一个字符的下标 
	else 
		return -1;			 // 模式匹配不成功 
}
int main()
{
	string S,P;
	int pos;
	cin >> S >> P >> pos;
	int x=index(S,P,pos);
	if(x==-1)
		cout << " 匹配不成功" << endl;
	else
		cout << "匹配成功" << "匹配结果=x" << endl;
	return 0;
 } 

运行结果为:
串的模式匹配算法——BF算法(C++代码)_第2张图片

三. BF算法分析

若设n为目标S的长度,m是模式P的长度,匹配算法最多比较n-m+1趟。若每趟比较都比较到模式P尾部才出现不等,要做m此比较,则在最坏的情况下,总比较次数(n-m+1)m。在多数场合下,m远小于n因此,==算法的运行时间为O(nm)==。

四. 低效的原因

算法在字符比较不相等,需要回溯(即i=i-j+1):即退到S中的下一个字符开始进行继续匹配。

五. 参考

中国大学MOOC 《数据结构》青岛大学 刘遵仁

你可能感兴趣的:(数据结构)