一般算法:
int Index(SString S,SString T,int pos)
{
int i=pos,j=1;
while(i<=S.len&&j<=T.len)
{
if(S[i]==T[i])
{
i++;
j++;
} //匹配时继续比较后续字符
else
{
i=i-j+2;
j=1;
} //不匹配主串指针回溯,重新开始匹配
}
if(j>T.len)
return i-T.len; //字符串匹配成功,返回主串首字母的位置
else
return 0; //字符串匹配失败
}
此算法在最坏情况的时间复杂度为O(n*m)
改进算法(KMP算法):
int Index_KMP(SString S,SString T,int pos)
{
int i=pos,j=1;
while(i<=S.len&&j<=T.len)
{
if(j==0||S[i]==T[j]) //j=0表示此前比较的是模式串首字符且不匹配,应从主串后续字符从头比较
{
i++;
j++;
} //匹配时继续比较后续字符
else
{
j=next[j];
} //模式串向右移
}
if(j>T.len)
return i-T.len; //字符串匹配成功,返回主串首字母的位置
else
return 0; //字符串匹配失败
}
此算法时间复杂度为O(n+m);