C++实现字符串匹配的KMP算法
2013-05-03 16:30
218 查看
之前看《算法导论》字符串匹配部分讲到KMP算法,被弄得云里雾里。今天看到阮一峰写了一篇博客《字符串匹配的KMP算法》[1~2],讲的浅显易懂,便按照他的思路用C++实现了一篇,代码如下:
代码的缺点是对字符串的处理太过生硬。习惯了python对string类型的切片操作后,对C++中string类型的使用太生疏,以至于取出子串的操作都用遍历相加来实现……
欢迎大家提出修改意见哈~
KMP算法:
[1] http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
[2] http://blog.jobbole.com/39066/
Boyer-Moore算法:
[3] http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html
[4] http://blog.jobbole.com/39132/
#include <iostream> #include <string> using namespace std; //计算单次的部分匹配值,如str=="ABCDAB"时返回2 int single_match(string str) { int match_num=0; int n=str.length(); string prefix,suffix; for(int i=0;i!=n-1;++i){ prefix=str.substr(0,i+1); suffix=str.substr(n-1-i); if(prefix==suffix) match_num+=prefix.length(); } return match_num; } //对整个字符串,计算其部分匹配表 void partial_match_table(string str,int* table) { int n=str.length(); for(int i=0;i!=n;++i){ string sub_str=str.substr(0,i+1); int temp=single_match(sub_str); table[i]=temp; } } // KMP算法 int Knuth_Morris_Pratt(string str1,string str2,int *table) { int n1=str1.length(); int n2=str2.length(); int i=0; while(i<n1-n2){ int j=0; while(j<n2){ if(str1[i+j]==str2[j]) ++j; else break; } if(j==n2) break; else if(j==0) ++i; else i+=j-table[j-1]; } if(i>n1-n2) return -1; return i; } int main() { string str1("BBC ABCDAB ABCDABCDABDE"); string str2("ABCDABD"); //cout<<single_match("ABCDAB")<<endl; int n=str2.length(); int *table=new int ; partial_match_table(str2,table); for(int i=0;i<n;++i) cout<<table[i]<<' '; cout<<endl; cout<<Knuth_Morris_Pratt(str1,str2,table)<<endl; return 0; }
代码的缺点是对字符串的处理太过生硬。习惯了python对string类型的切片操作后,对C++中string类型的使用太生疏,以至于取出子串的操作都用遍历相加来实现……
欢迎大家提出修改意见哈~
KMP算法:
[1] http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
[2] http://blog.jobbole.com/39066/
Boyer-Moore算法:
[3] http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html
[4] http://blog.jobbole.com/39132/
相关文章推荐
- 字符串匹配KMP算法C++代码实现
- 算法串匹配C++实现字符串匹配的KMP算法
- C语言实现字符串匹配KMP算法
- 字符串匹配Sunday算法C++实现
- 算法 字符串匹配之朴素算法和KMP算法及JAVA代码实现
- 字符串匹配KMP算法实现
- 字符串匹配Sunday算法C++实现
- 字符串匹配问题——KMP算法实现
- 字符串匹配的KMP算法详解及C#实现
- Leetcode28. kmp算法实现字符串匹配
- 字符串匹配问题——求给定字符串的next数组以及KMP算法实现
- KMP字符串匹配C++代码实现
- 字符串匹配的KMP算法和朴素算法,及其python实现
- 字符串匹配的KMP算法详解及C#实现
- 字符串匹配之KMP算法思路、原理与Java实现
- 字符串匹配的KMP算法——Python实现
- kmp算法字符串匹配C语言实现
- 字符串匹配的KMP算法实现
- 算法导论-第32章-字符串匹配:Knuth-Morris-Pratt(KMP)算法C++实现
- C++中用栈来判断括号字符串匹配问题的实现方法