串的模式匹配(c实现)
KMP模式匹配的核心思想:
省略一部分不必要的判断步骤(即去掉没必要的回溯步骤)
主串和匹配串分别的改变方式:
主串:是不会跳跃性改变,而只是会依次的递增比较下去
匹配串:根据匹配失败的串的后缀串与前缀串的匹配程度,从而确定回溯的位置
算法的实现:
分两块(两个函数):
First:一个能计算出匹配串中每一个位置匹配失败后,需回溯的位置的函数。
Second:一个能将匹配串和主串相比较匹配的函数。
KMP算法的重点考研考点: next数组
/*
暂且跳过,待补充
*/
代码实现:
///KMP模式匹配算法实现
///计算出匹配串中每一个位置匹配失败后,需回溯的位置
///即生成next数组
void get_next(String T,int *next){
int i,j;
int i = 1;
int j = 0;
next[1] = 0;
while(i<T[0]) // 此处的T[0]表示串T的长度
{
if(j==0||T[i]==T[j]){
//T[i]表示后缀的单个字符
//T[j]表示前缀的单个字符
++i;
++j;
next[i] = j;
}
else j = next[j]; //若字符不相同,则j回溯
}
}
#define MAX 255
///KMP模式匹配算法实现
///计算出匹配串中每一个位置匹配失败后,需回溯的位置
///即生成next数组
void get_next(String T,int *next){
int i,j;
int i = 1;
int j = 0;
next[1] = 0;
while(i<T[0]) // 此处的T[0]表示串T的长度
{
if(j==0||T[i]==T[j]){
//T[i]表示后缀的单个字符
//T[j]表示前缀的单个字符
++i;
++j;
next[i] = j;
}
else j = next[j]; //若字符不相同,则j回溯
}
}
///返回子串T在主串S中第pos个字符之后的位置。若不存在则返回0
int Index_KMP(String s,String T,int pos){
int i = pos; //i用于表示主串S当前位置下的标值
int j = 1;
int next[MAX]; //定义一next数组
get_next(T,next); //得到next数组
while(i<=s[0]&&j<=T[0]){
if(j==0||s[i]==T[j]){
++i;
++j;
}
else{
j = next[j];
}
}
if(j>T[0]) return i-T[0];
else return 0;
}