KMP 算法 字符串比较
2014-09-01 19:23
274 查看
/* KMP algorithm http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html */ #include<iostream> #include<string> using namespace std; // 普通的字符串比较函数 int compare(string s1,string s2) { int i=0,j=0; while(i<(s1.length()-s2.length()) ) { while(s1[i]==s2[j] ) { cout<<"s1["<<i<<"]"<<s1[i]<<endl; cout<<"s2["<<j<<"]"<<s2[j]<<endl; i++; j++; if (s2.length()==j) { //return i-s2.length(); cout<<"right"<<endl; return 1; } } i=i-j+1; j=0; } return 0; } /*KMP得到下一个值 根据定义next[0]=-1,假设next[j]=k, 即P[0...k-1]==P[j-k,j-1] 1)若P[j]==P[k],则有P[0..k]==P[j-k,j],很显然,next[j+1]=next[j]+1=k+1; 2)若P[j]!=P[k],则可以把其看做模式匹配的问题,即匹配失败的时候,k值如何移动, 显然k=next[k] */ void getNext_recursion(string s2,int next[]) { int j=0,k=-1; next[0]=-1; while (j<s2.length()-1) { if (k==-1||s2[j]==s2[k]) { j++; k++; next[j]=k;//next[j++]=k++; } else k=next[k]; } } int KMP(string s1,string s2) { int next[100]; getNext_recursion(s2,next); int i=0,j=0; while(i<s1.length() ) { if(j==-1||s1[i]==s2[j]) { i++; j++; } else { j=next[j]; } if (s2.length()==j) { return i-j; } } return 0; } int main() { string s1="ababcababa",s2="ababa"; /*cout<<"请输入text值"<<endl; cin>>s1; cout<<"请输入query值"<<endl; cin>>s2;*/ cout<<s1<<endl; cout<<s2<<endl; //cout<<compare(s1,s2); cout<<KMP(s1,s2); cout<<endl; return 0; }
相关文章推荐
- 一个比较字符串和一个计算N个数字阶乘之和的算法
- KMP 算法并非字符串查找的优化
- 字符串算法--KMP--Java实现
- 实现一个比较高级的字符匹配算法,即一串很长的字符,要求找到符合要求字符的字符串
- C语言 算法"KMP" 查找字符串 ”模式匹配“
- 字符串 KMP 算法
- KMP 算法并非字符串查找的优化 [转]
- 算法:字符串的KMP模式匹配
- KMP字符串模式匹配算法
- 子字符串substring 问题 - KMP 字符串匹配算法备忘录
- Delphi中比较两个字符串相似性的百分比算法
- 字符串模式匹配(所谓的kmp)算法
- KMP 算法并非字符串查找的优化 [转]
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
- KMP字符串模式匹配算法实现(php)
- 一种比KMP更优的字符串模式匹配算法
- 字符串简单模式匹配算法与IndexOf方法比较
- [zz]三种模式匹配算法(KMP,MonteCarlo,LasVegas)的比较与分析
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽