字符串匹配算法
一. 朴素的模式匹配算法
该算法需要回溯,所以是以回溯来处理字符串的匹配的。
/*基本数组实现Index的算法*/
//T为非空串。若主串S中第pos个字符之后存在与T相等的子串,则返回第一个这样的子串,则返回第一个这样的子串在S中的位置,否则返回0
int Index(String S,String T,int pos)
{
int i = pos;
int j = 1;
while (i<=S[0] && j<= T[0])
{
if (S[i] == T[j]) //两字母相等则继续
{
++i;
++j;
}
else //重新开始匹配
{
i = i-j+2; //i退回上次匹配首位的下一位
j = 1;
}
}
if (k>T[O])
return i = T[0];
else
return 0;
}
时间复杂度为0((n-m+1)*m),其中n为S的长度,m为T的长度。二. KMP模式匹配算法
该算法不需要回溯,所以是以不回溯来处理字符串的匹配的。
//计算返回子串T的next数组,T[0]表示子串T的长度
void get_next(String T,int* next)
{
int i,j;
i=1;
j=0;
next[1]=0;
while(i<T[0])
{
if(j==0 || T[i]==T[j])
{
++i;
++j;
next[i]=j;
}
else
{
j=next[j];
}
}
}
//返回子串T在主串S中第pos个字符之后的位置,若不存在,则函数返回值为0
int Index_KMP(String S,String T,int pos)
{
int i=pos;
int j=1;
int next[255];
get_next[T,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;
}
时间复杂度为0(n+m)。