您的位置:首页 > 其它

字符串的匹配模式:朴素的模式匹配算法(BF算法)

2017-11-13 13:16 323 查看
基本思想:从主串s寻找子串t,从s和t的第一个字符开始匹配,若匹配,则继续第二个匹配,若到后面(匹配到第m位,未匹配完),则子串t回溯到第一个字符,主串回溯到第二个字符,继续子串的第一个和主串的第二个匹配。。。。

伪代码:

在串s和串t中设置比较的起始下标i和j;

重复下述操作,直到s或t的所有字符均比较完毕;

2.1 如果s[i]等于t[j],继续比较s和t的下一对字符

2.1否则将下标i和j回溯,准备下一趟比较

如果t中所有字符均比较完,则匹配成功,返回匹配的开始位置,否则,匹配失败,返回0(约定返回0代表匹配失败)



图片来源于数据结构(C++版)清华大学出版社

下面是代码的展示:

#include<iostream>
#include<string>
using namespace std;

int main() {
int BF(char s[],char t[]);  //BF算法
char s[13] = {'a','a','a','a','a','a','a','a','a','a','b','c'};   //测试的主串
char t[3] = {'b','c'};    //匹配的子串
int aa=BF(s, t);
cout << aa;
return 0;
}

int BF(char s[],char t[]) {
int i =0,j=0;
while ((s[i]!='\0')&&t[j]!='\0') {       //匹配的的主要过程
if (s[i]==t[j]) {    //假如s[i]与t[j]相等,则继续匹配
i++;
j++;
}
else {   //假如s[i]与t[j]不相等,则回溯继续匹配
i = i - j+1;
j = 0;
}
}
if (t[j] == '\0') {    //匹配结束,判断是否匹配成功
return i-j+1;    //匹配成功,返回匹配的位置
}
else {
return 0;   //匹配失败,返回0
}
}


反思:假如我们足够幸运,那么我们匹配所花费的时间就是我们所花费的时间复杂度是o(n+m)

假如我们遇到了最坏的情况,那么我们的时间复杂度就是o(n*m),在当今数据量暴涨的情况下,在很多情形下可能是不适用的,但好处就是容易理解,可以很快就写出来了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: