串的模式匹配一般分为两种:简单模式匹配和KMP算法
#include <stdio.h> #include <stdlib.h> #define MaxSize 100 typedef struct{ char str[MaxSize+1]; int length; }Str;//串的存储结构 int index1(Str *str1,Str *str2){ int i=1,j=1; int pos=i;//记录当前主串开始匹配的起始位置 while(i<=str1->length&&j<=str2->length){ if(str1->str[i]==str2->str[j]){ i++; j++; } else{ j=1; i=++pos;//若匹配失败,则将起始位置的下一个位置开始 } } if(j>str2->length){ printf("模式串在主串中的位置:%d\n",pos); return pos; } else return 0; }//简单模式匹配 int GetLength(Str *str1){ int i=0; while(str1->str[i+1]){ i++; } return i; }//获得串的长度 void get_next(Str *str2,int next[]){ int i=1,j=0; next[1]=0; while(i<str2->length){ if(j==0||str2->str[i]==str2->str[j]){ i++; j++; next[i]=j; } else {j=next[j];} } }//构造next数组 int index_KMP(Str *str1,Str *str2,int next[]){ int i=1,j=1; while(i<=str1->length&&j<=str2->length){ if(j==0||str1->str[i]==str2->str[j]){ i++; j++; } else j=next[j]; } if(j>str2->length){ printf("模式串在主串中的位置:%d\n",i-str2->length); return i-str2->length; } else return 0; }//KMP算法 void main(){ Str str1; Str str2; int next[MaxSize];//kmp算法中的next数组 scanf("%s",str1.str);//0ababcabcacbab scanf("%s",str2.str);//0abc str1.length=GetLength(&str1); str2.length=GetLength(&str2); index1(&str1,&str2); get_next(&str2,next); index_KMP(&str1,&str2,next); }