算法设计--串匹配问题:BF算法、KMP算法、BM算法

#include
#include
using namespace std;

/*
* BF算法
* 基本思想:
*从主串S的第一个字符开始和模式T(子串)的第一个字符进行比较,若相等,则继续比较两者的后续字符;
*若不相等,则从主串S的第二个字符开始和模式T的第一个字符进行比较,重复上述过程,若T中的字符全部比较完毕,则说明本趟匹配成功;
*若最后一轮匹配的起始位置是n-m(n为主串的长度,m为模式T的长度),则主串S中剩下的字符不足够匹配整个模式T,匹配失败。
*这个算法称为朴素的模式匹配算法,简称BF算法。
*/

int BF(string &s, string &t)
{
	int i=0,j=0,count=0;		//i指向主串s,j指向子串t,count计算匹配的字符长度
	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<<"字符串匹配成功,起始位置为:"<= 0)
	{
		if(ch == t.at(i))
		{
			return len - 1 - i;	//返回滑动距离
		}
		else {
			i--;
		}
	}
	return len;
}

//BM算法
/*基本思想:有
*假设将主串中自位置i起往左的一个子串与模式进行从右到左的匹配过程中,若发现不匹配
*,则下次应从主串的i+dist(Si)位置开始重新进行新一轮的匹配,其效果相当于把模式和主串均向右
* 滑过一段距离dist(Si),即跳过dist(Si)个字符而无需进行比较。
*/
int BM(string &s, string &t, int n, int m)
{
	//主串的长度为n,模式串的长度为m,主串和模式的数组下标从0开始
	int i = m - 1;
	while(i <= n)
	{
		int j = m - 1;
		while(j > 0 && s.at(i) == t.at(j)){
			j--;
			i--;
		}
		if(j == 0) 
		{
			cout<<"字符串匹配成功,起始位置:"<>s;
	cout<<"请输入子串T:"<>t;

	//调用BF算法进行字符串匹配
	cout<<"BF算法:"<


你可能感兴趣的:(算法设计--串匹配问题:BF算法、KMP算法、BM算法)