串的模式匹配(基于修正的KMP的匹配算法)

来源:互联网 发布:男式真皮鞋上淘宝 编辑:程序博客网 时间:2024/06/13 20:30
#include<stdio.h>#include<malloc.h>#include<time.h>#include<stdlib.h>#include<string.h>#define ElemType chartypedef struct{ElemType *start;//顺序字符串的起始位置int length;//字符串的长度,即串中的字符个数}CommonStr;int nextval[20]={0};//用于存放模式串的next值的数组int CreateStr(CommonStr &pstr, int n)//生成用于测试的主串{pstr.start=(ElemType *)malloc(100*sizeof(ElemType));int i, k=0;pstr.length=0;srand((unsigned)time(NULL));for(i = 0; i < n; i++){pstr.start[i] = (char)(rand()%2 + 'a');pstr.length++;}pstr.start[i] = '\0';return 1;}int GetNextval(CommonStr str){//求模式串的next函数值并存入数组next中int j = 0, k = -1; nextval[0] = -1;while(j < str.length){if(k == -1 || str.start[k] == str.start[j]){++k; ++j;if(str.start[j] != str.start[k])nextval[j]=k;elsenextval[j]=nextval[k];}else k=nextval[k];}printf("求得模式串的next数组为:\n\n");for(k = 0; k < 4; k++){printf("%d - ", nextval[k]);}printf("%d\n\n", nextval[k]);return 1;}int DisplayStr(CommonStr str)//打印字符串{for(int i = 0; i < str.length - 1; i++){//打印前面的字符printf("(%3d,%c) ", i + 1, str.start[i]);}printf("(%3d,%c)\n\n", i + 1, str.start[i]);//打印最后一个字符return 1;}int KmpIndex(CommonStr pstr, CommonStr mstr){int i=0, j=0;while(i<pstr.length && j<mstr.length){if(j==-1 || pstr.start[i] == mstr.start[j]){i++; j++;}else j=nextval[j];}if(j > mstr.length-1){printf("该模式串在主串第一次出现的起始位置为:%d !\n\n", i - mstr.length + 1);return 1;}else{printf("该模式串在主串中没有出现过!\n\n");return -1;}}int main(){CommonStr pstr, mstr;CreateStr(pstr, 100);printf("随机生成的主串为:\n\n");DisplayStr(pstr);CreateStr(mstr, 10);printf("随机生成的模式串为:\n\n");DisplayStr(mstr);GetNextval(mstr);KmpIndex(pstr, mstr);return 1;}

原创粉丝点击