字符串的匹配模式:朴素的模式匹配算法(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代表匹配失败)
![](https://img-blog.csdn.net/20171113130057286?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hpbGluZ18xMDI0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图片来源于数据结构(C++版)清华大学出版社
下面是代码的展示:
反思:假如我们足够幸运,那么我们匹配所花费的时间就是我们所花费的时间复杂度是o(n+m)
假如我们遇到了最坏的情况,那么我们的时间复杂度就是o(n*m),在当今数据量暴涨的情况下,在很多情形下可能是不适用的,但好处就是容易理解,可以很快就写出来了。
伪代码:
在串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),在当今数据量暴涨的情况下,在很多情形下可能是不适用的,但好处就是容易理解,可以很快就写出来了。
相关文章推荐
- 字符串模式匹配算法之一:朴素模式匹配算法
- 字符串-朴素的模式匹配算法
- BF算法(朴素的模式匹配算法)
- 朴素的字符串模式匹配算法
- (串的模式匹配4.6.1)POJ 3080 Blue Jeans(使用朴素的模式匹配算法求最长的公共子串)
- 字符串模式匹配算法实现1
- 字符串多模式精确匹配(脏字/敏感词汇搜索算法) 之算法前传II
- 字符串多模式精确匹配(脏字/敏感词汇/关键字过滤算法)——TTMP算法 之实战F模式
- 两个字符串模式匹配的算法
- 字符串--KMP模式匹配算法
- 字符串多模式精确匹配(脏字/敏感词汇搜索算法)——TTMP算法 之理论如此
- 串的模式匹配算法(求子串位置的定位函数,适合一般字符串定位)
- 字符串朴素匹配算法
- 字符串简单模式匹配算法与IndexOf方法比较
- 使用C语言实现串的匹配朴素算法(BF算法)
- 字符串模式匹配算法2 - AC算法
- KMP字符串模式匹配算法
- 字符串模式匹配算法实现1
- 字符串模式匹配——Shift-And和Shift-OR算法[转]
- KMP算法--字符串模式匹配算法