字符串查询算法-BF-MP

最近在看算法之美,看到60多页,想的还是动动手吧

BF算法:

参考博客:

https://blog.csdn.net/swagle/article/details/24012567

字符串查询,最简单的方法就是,BF暴力查询法

问题:

给定两个串S="s0, s1, s2, ...., sn", T="t0, t1, t2,..., tn", 在主串S中查找字串T的过程称为字符串匹配问题,T称为模式串。

伪代码:

1. 首先设定 S 和 T 的起始比较下标 i 和 j;

2. 循环直到 i+m>n 或者T中的字符都比较完(j==m)
{
    2.1 如果S[i]==T[j], 继续比较S和T的下一个字符,否则
    2.2 将 i 和 j 回溯,准备下一轮比较
}

3. 如果T中的字符都比较完(j==m),则返回比较的起始下标
    否则返回-1,表示匹配失败

实现:

#include <iostream>  
#include <string>

using namespace std;


void BF(string p, string t) {

	int m = p.length();
	int n = t.length();
	if (m > n) {
		cerr << "Unsuccessful match!" << endl;
		return;
	}

	const char * x = p.c_str(); // 	x m 小
	const char * y = t.c_str(); //   n y 大

	int i = 0;

	while (i+m <= n) {
		int k=i, j=0;
		for (; j < m && k < n && x[j] == y[k]; ++k, ++j){};

		/*
		for ( init; condition; increment )
		{
   			statement(s);
		}
		init 会首先被执行,且只会执行一次
		判断 condition。如果为真,则执行循环主体。如果为假,控制流会跳出整个for循环
		执行完 for 循环主体后,控制流会跳回上面的 increment 语句
		条件再次被判断。如果为真,则执行循环,条件变为假时,for 循环终止
		*/

		if (j == m)
		{
			cout << "Matching index found at: " << i << endl;
		}

		i++;
	}
}

int main(int argc, char** argv) {

	string p1 = "abcabcad";
	string p2 = "adcadcad";
	string p3 = "ababcaabc";
	string t = "ctcabcabcadtcaabcabcadat";

	cout << "BF : " << endl;
	BF(p1, t);

	//  cout<<"MP : "<<endl;  
	//  MP(p2, t);  
	//  cout<<endl;  

	//  cout<<"MP : "<<endl;  
	//  MP(p3, t);  

	cout << endl;
	//system("PAUSE");
	return 0;
}

实例

假定给定主串 S="ababcabcacbab", 模式 T="abcac", BF匹配过程如下:

 

MP算法:

参考博客:

https://blog.csdn.net/zhangbo_0323/article/details/73738094

代码

#include <iostream>  
#include <string>

using namespace std;

void preMp(const char *x, int m, int mpNext[]) {
	int i, j;

	i = 0;
	j = mpNext[0] = -1;
	while (i < m) {
		while (j > -1 && x[i] != x[j])
			j = mpNext[j];
		mpNext[++i] = ++j;
	}
}

void MP(string p, string t) {

	int m = p.length();
	int n = t.length();
	if (m > n) {
		cerr << "Unsuccessful match!" << endl;
		return;
	}

	const char * x = p.c_str();
	const char * y = t.c_str();

	//const int mm = m + 1;
	int i = 0, j = 0, result = -1, mpNext[1000];

	preMp(x, m, mpNext);

	while (j < n) {
		while (i > -1 && x[i] != y[j])
			i = mpNext[i];

		i++;
		j++;
		if (i >= m) {
			cout << "Matching index found at: " << j - i << endl;
			i = mpNext[i];
		}
	}
}

int main(int argc, char** argv) {

	string p1 = "abcabcad";
	string p2 = "adcadcad";
	string p3 = "ababcaabc";
	string t = "ctcabcabcadtcaabcabcadat";

	cout << "MP : " << endl;
	MP(p1, t);
	cout << endl;

	//  cout<<"MP : "<<endl;  
	//  MP(p2, t);  
	//  cout<<endl;  

	//  cout<<"MP : "<<endl;  
	//  MP(p3, t);  

	cout << endl;
	//system("PAUSE");
	return 0;
}

实例

假定给定主串 S="ctcaatcacaatcat", 模式 T="caatcat", MP匹配过程如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值