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