KMP算法-字符串匹配
2015-10-20 16:50
337 查看
先看看普通字符串匹配BF算法。
代码实现:
http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html
大概思想就是:不匹配时,模式串的指针不是移动一步,而是根据部分匹配值来移动。
![](https://img-blog.csdn.net/20151020163350362)
![](https://img-blog.csdn.net/20151020163407566)
![](https://img-blog.csdn.net/20151020163422128)
BF算法
BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。代码实现:
int BFMatch(string s,string p){ int i,j; for(i=0;i<s.length();i++){ j=0; while(j<p.length() && s[i]==p[j]){ i++; j++; } if(j==p.length()){ return i-p.length(); } i=i-j+1; } return -1; }
KMP算法
原理介绍可以看篇文章:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html
大概思想就是:不匹配时,模式串的指针不是移动一步,而是根据部分匹配值来移动。
代码:
//生成串p的部分匹配值 vector<int> getMatch(string p){ auto len=p.length(); vector<int> match(len,-1); match[0]=0; for(int i=1,k=0;i<p.length();i++){ while(k>0 && p[i]!=p[k]){ //k对应的串往后移动(已匹配长度-部分匹配值),并且定位到部分匹配长度位置。 //因为i不变,k更新到match[k-1] k=match[k-1]; } if(p[i]==p[k]) { k++; } match[i]=k; } return match; } //找出s中p的所有匹配,返回每个匹配的首地址 vector<int> KMPMatch(string s,string p){ vector<int> ret; vector<int> match=getMatch(p); for(int i=0,k=0;i<s.length();i++){ while(k>0 && s[i]!=p[k]){ k=match[k-1]; } if(s[i]==p[k]){ k++; } if(k==p.length()){ ret.push_back(i+1-p.length()); //返回s中匹配p的所有首地址 k=match[k-1]; } } return ret; }
相关文章推荐
- KMP算法的C#实现方法
- JavaScript中数据结构与算法(五):经典KMP算法
- C语言实现字符串匹配KMP算法
- 字符串算法--KMP--Java实现
- KMP算法(转载)
- kmp算法实现
- [OpenJudge]带有通配符的字符串匹配
- KMP算法详解
- linux kernel data struct: KMP算法实现
- 求一个字符串中连续出现次数最多的子串
- KMP算法总结
- KMP字符串匹配算法
- KMP字符串匹配算法
- 字符串匹配/模糊匹配(查找/模糊查找)的算法
- 字符串匹配之KMP算法
- kmp
- 【hiho一下第三周】KMP计算模式串在原串出现次数
- HDU1711 模板题-KMP
- PHP展示KMP拓展算法思想
- Java实现AC自动机全文检索