参考:https://www.cnblogs.com/lufangtao/p/3245647.html
1.简单模式匹配
从主串的第pos位置字符开始和模式子串字符比较,如果相等,则继续逐个比较后续字符;否则从主串的下一个字符起再重新和模式子串的字符比较。直到找到匹配字符串或者是主串结尾。其中主串需要回溯到失配的位置的下一个位置,子串回溯到最开始位置。
例如,主串T为:ababcabababab,子串为ababa,上述过程如下图所示。
参考代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 /* 2 检测从主串T的pos位置开始,是否有和子串S匹配,如果有返回匹配开始位置,如果没有,返回-1 3 T:主串 4 S:子串 5 tlength:主串长度 6 slength:子串长度 7 pos:主串开始位置 8 */ 9 int Index (char T[],char S[],int tlength,int slength,int pos) 10 { 11 int j=0,i=pos; 12 while(i<tlength&&j<slength) 13 { 14 if(T[i]==S[j]) 15 { 16 i++; 17 j++; 18 } 19 else 20 { 21 i=i-j+1; 22 j=0; 23 } 24 } 25 return j==slength?i-slength:-1; 26 27 }
2.KMP算法
与简单算法的区别,KMP的特点是主串不用回溯,只需回溯子串即可, 即只需给子串找到一个“合适的位置”接着进行匹配,而不用挪动主串。我们的任务就是确定这个“合适的位置",从而引出了next数组。我们用next[j]表示当模式子串中第j个字符与主串中相应的字符失配时,在模式串中需要重新和主串中该字符比较的字符的位置。需要说明的是,求next数组时只与模式字串自身的结构有关系,与主串无关。
另next数组求法:https://blog.csdn.net/wenyun_kang/article/details/65436838
参考代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 int KMP_Index(char T[],char S[],int tlength,int slength,int pos) 2 { 3 int *next=(int*)malloc(slength*sizeof(int)); 4 KMP_Next(S,next,slength); 5 6 int j=-1,i=pos-1; 7 while(i<tlength&&j<slength) 8 { 9 if(j==-1||T[i]==S[j]) 10 { 11 i++; 12 j++; 13 } 14 else 15 j=next[j]; 16 } 17 return j==slength?i-slength:-1; 18 19 20 }