C++ 中KMP字符串匹配算法
C++ #kmp #算法 #字符串匹配2012-11-09 10:46
//============================================================================ // Name : KMP.C // Author : ruochenchen http://yige.org/cpp/ // Created on : 2012-11-01 // Copyright : Your copyright notice // Compiler : VS2010 // Language : C/C++ // Description : KMP字符串匹配算法 //============================================================================ //-----------串的结构采用《数据结构》吴伟民版对于串定长顺序的描述 //-----------串的定长顺序储存结构------------------- #define MAXSTRLEN 255 //最大串长 typedef unsigned char SString[MAXSTRLEN + 1]; //0号单元存放串的长度 int next[20]; //-----------串的定长顺序储存结构------------------- //-----------基本操作------------------ int StrAssign(SString S, char * chars); //初始条件: //操作结果:生成一个其值等于串常量chars的串S int StrLength(SString S); //初始条件:串S存在 //操作结果:返回S的元素个数。 int StrAssign(SString S, char * chars) { int i = 0, j = 1; while (chars[i] != '\0' && j <= MAXSTRLEN) { S[j] = chars[i]; j++; i++; } if (chars[i] != '\0') { return - 1; } S[j] = '\0'; //S[0]=StrLength(S); } int StrLength(SString S) { int i = 1, count = 0; while (S[i] != '\0') { count++; i++; } return count; } //-----------基本操作------------------ #include < stdio.h > #include < string.h > void get_next(SString T, int next[]); void get_next(SString T, int next[]) { //求模式串T的next函数值并存入数组next。 int i = 1, j = 0; next[1] = 0; while (i < T[0]) { if (j == 0 || T[j] == T[i]) {++i; ++j; next[i] = j; } else j = next[j]; } } int Index_KMP(SString S, SString T, int Pos) { int i = Pos, j = 1; int sl, tl; sl = StrLength(S); tl = StrLength(T); while (i <= sl && j <= tl) { if (j == 0 || S[i] == T[j]) {++i; ++j; } else { j = next[j]; } } if (j > tl) { printf("匹配成功"); return i - tl; } else printf("无法匹配模式"); } //----------主函数 void main() { SString S, T; char Tstr[20]; int seat; char Str[] = "TTATAGATCTCGTATTCTTTTATAGATCTCCTATTCTT"; //匹配的文本序列 StrAssign(S, Str); printf("请输入模式字符串:\n"); scanf("%s", Tstr); StrAssign(T, Tstr); get_next(T, next); seat = Index_KMP(S, T, 1); printf("在第%d个位置匹配", seat) }
相关文章
- c/c++编译笔记 2012/11/07