算法导论32(字符串匹配)
2014-10-06 21:59
162 查看
32.1 朴素字符串匹配算法
32.3 利用有限自动机进行字符串匹配
32.4 KMP(Knuth-Morris-Pratt)算法
#include<iostream> using namespace std; #define n 19 #define m 5 void naive_string_matcher(int *T,int *P) { for(int s=0;s<=n-m;s++) { int matched=1; for(int j=0;j<m;j++) { if(P[j]!=T[s+j]) { matched=0; break; } } if(matched==1)cout<<"Pattern occurs with shift "<<s<<endl; } } int main() { int T ={2,3,5,9,0,2,3,1,4,1,5,2,6,7,3,9,9,2,1}; int P[m]={3,1,4,1,5}; naive_string_matcher(T,P); return 0; }32.2 Rabin-Karp算法
#include<iostream> using namespace std; #define n 19 #define m 5 void Rabin_Karp_matcher(int *T,int *P) { int p=0,t=0; for(int i=0;i<m;i++) { p=(10*p+P[i])%13; t=(10*t+T[i])%13; } for(int s=0;s<=n-m;s++) { if(p==t) { int matched=1; for(int j=0;j<m;j++) { if(P[j]!=T[s+j]) { matched=0; break; } } if(matched==1)cout<<"Pattern occurs with shift "<<s<<endl; } if(s<n-m-1) { t=(10*(t-T[s]*3)+T[s+m])%13; if(t<0)t+=13; } } } int main() { int T ={2,3,5,9,0,2,3,1,4,1,5,2,6,7,3,9,9,2,1}; int P[m]={3,1,4,1,5}; Rabin_Karp_matcher(T,P); return 0; }
32.3 利用有限自动机进行字符串匹配
32.4 KMP(Knuth-Morris-Pratt)算法
#include<iostream> using namespace std; //前缀p0..pk匹配后缀pj-k..pj void GetNext(string p,int next[]) { next[0]=-1; int k=-1,j=0,pLen=p.length(); while(j<pLen-1) { if(k==-1||p[k]==p[j])next[++j]=++k; else k=next[k]; //当且仅当p[0]匹配失败,k=-1 } } //i索引t,j索引p,j=-1表示p[0]已匹配失败,j>=0表示已匹配j个字符。 int KMP(string t,string p,int next[]) { int i=0,j=0,tLen=t.length(),pLen=p.length(); while(i<tLen&&j<pLen) { if(j==-1||t[i]==p[j]) { i++; j++; } else j=next[j]; //当且仅当p[0]匹配失败,j=-1 } if(j==pLen)return i-j; else return -1; } int main() { string t="BBC ABCDAB ABCDABCDABDE"; string p="ABCDABD"; int next[7]; GetNext(p,next); cout<<KMP(t,p,next)<<endl; return 0; }
相关文章推荐
- Java中使用正则表达式实现字符串匹配
- 对ZZL字符串匹配算法的改 ——ZZL最短匹配定理
- Java编程—实现字符串匹配
- 字符串匹配之朴素算法
- 字符串匹配的KMP算法
- C++ string 字符串匹配
- CCF—字符串匹配 20140903
- 面试-字符串匹配ABBA模式
- 字符串匹配(一)——从暴力匹配到KMP算法
- 【模板】字符串匹配KMP算法
- 字符串匹配
- Codeforces Round #410 (Div. 2) B. Mike and strings(字符串匹配)
- 正则表达式对字符串匹配
- 字符串匹配的KMP算法
- POJ 3276 The Cow Lexicon DP-字符串匹配
- 字符串匹配朴素算法
- 字符串匹配-KMP
- BZOJ4259:残缺的字符串(FFT与字符串匹配)
- 寒假集训-字符串匹配的KMP算法
- [压位 || FFT] 【Hillan 的题】简单字符串匹配