KMP
来源:互联网 发布:最大公约数 java 编辑:程序博客网 时间:2024/06/07 05:12
#include <iostream>using namespace std;// 已知nextval向量的情况下,如何进行模式匹配int GetIndex(const char *src, const char *pattern, int nextval[]){ // 若匹配成功,返回匹配起点下标,否则返回-1int i = 0; //主串的下标int j = 0; //模式串下标while(src[i] != '\0' && pattern[j] != '\0'){ if(src[i]==pattern[j]) { i++; j++; } else { if(nextval[j] == -1) //模式串已没有可以匹配的位置了 { i++; j=0; //从头开始匹配 } else { j = nextval[j] ; } }}return pattern[j]=='\0' ? i-j : -1 ; }int getnextval(const char *pattern, int nextval[]){ int k = -1 ; //最大相同 首真子串和尾真子串, // 为了让k1 = 0;则让k0 = -1,k1=0表示模式串第1个字符不匹配时,从第0个字符开始 nextval[0] = -1 ;// 第0个实符匹配失败,表示模式串根本没有可能匹配的位置了 for(int i=1 ; pattern[i] != '\0' ; i++) { //要是pattern[i] != pattern[k]时,则又是一个模式匹配问题,则 k = nextval[k],直到匹配,或者根本没有可能匹配,k=-1表示根本没有可能匹配 while(k != -1 && pattern[i-1] != pattern[k] ) k = nextval[k] ; k++ ; //要是已经匹配了,则k++, 要是根本没有可能匹配 了,k++刚好k=0 表示从第 0 个字符开始 // 校正得到nextval[i] if( pattern[i]== pattern[k]) nextval[i] = nextval[k] ; else nextval[i] = k; } return 1;}int main(){ char src[100] ="abaabaaaaab"; char pattern[20] = "aaaab" ; int nextval[100] ; getnextval(pattern, nextval); int pos = GetIndex(src,pattern,nextval); cout<<"源串为"<<src<<endl; cout<<"模式串为"<<pattern<<endl; cout<<"匹配的开始位置是:"<<pos<<endl; system("pause"); return 0;}