C++ 改进的KMP模式匹配算法

来源:互联网 发布:淘宝正版音像店 编辑:程序博客网 时间:2024/05/17 09:02

我们在处理数据的过程中,总会遇到处理字符串的问题,现在贴上字符串匹配算法改进的KMP代码及实验结果,大家一起学习。


KMP算法主要是在于为了减少重复比较的次数而计算了一个next[]数组值,但后来又发现有些字母相同的比较也是多余的,因此为了减少这部分的 时间,提高效率,准备计算一个新的数组nextval。



#include"c1.h"#define MAX 1000using namespace std;char s[MAX],t[MAX];int next[MAX];void ComputeNext(char *T,int *next,const int& lenT){int i,j;next[0] = -1;i = 0;j = -1;while(i<lenT){while(j>=0&&T[i] !=T[j] )j = next[j];j++;i++;//改进的KMP模式匹配算法,算nextval值if(T[i]==T[j])next[i] = next[j];elsenext[i] = j;}}int KMP(char *s,char *T,int *next,const int lenS,const int lenT){int i,j;i=j=-1;while(i<lenS&&j<lenT){if((j==-1)||(s[i]==T[j])){i++;j++;}elsej = next[j];}if(j>=lenT)return i-lenT+1;else return 0;}int main(){int next[1000];int cases;cout<<"请输入案例的个数:";cin>>cases;while(cases--){cout<<"请输入主串:"<<endl;cin>>s;int lenS = strlen(s);while(1){cout<<"请输入需要匹配的模式串(输入0结束):"<<endl;cin>>t;if(!strcmp(t,"0"))break;int lenT = strlen(t);for(int i=0;i<lenT;i++)next[i] = -1;ComputeNext(t,next,lenT);int pos = KMP(s,t,next,lenS,lenT);if(pos==0)cout<<"没有匹配项!"<<endl;elsecout<<"匹配的开始位置为:"<<pos<<endl;}}return 0;}

支持几组字符串同时进行比较,输入0结束当前的字符串匹配。




0 0
原创粉丝点击