最近在看算法之美,看到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匹配过程如下: