1.算法的应用
存在两个不等长的字符串,判断短的字符串是否长的字符串的字串,如果是返回子串的首个字符的下标;如果否,则返回0.
注:长字符串的第一元素为字符的长度。
2.算法的关键:求next数组
T为长字符串
(1).[next数组]: 当模式匹配串T失败的时候,next数组对应的元素指导用T串的哪个元素进行下一轮的匹配;
(2).前缀:T[i],为固定的;
(3).后缀:T[j],为相对的,当前匹配元素的前一个;
(4).匹配原则:
当T[i]==T[j]时,i++,j++,next[i]数值等于j;
不同,就j要回溯到next[j]的值开始;
(5)优化
如果发生失配时,后缀与前面的一致,退回到前缀对应的next[i]对应的值;
代码实现
void getNext(string T,int *next)
{
int j=0,i=1;
next[1] = 0;
while(i<T[0]) //T[0]存放长字符串的长度
{
if(0 == j || (T[i] ==T[j])){
i++;
j++;
if(T[i] ==T[j]) next[i] =next[j];
else next[i] = j;
}else{
j = next[j];
}
}
}
3.实现字串查找
查找成功返回子串的首个字符的下标;如果否,则返回0.
int indexKMP(string S,string T,int pos)
{
int i = pos;
int j = 1;
int next[255];
getNext(T,next);
while(i<=S[0]&&j<=T[0])//s[0]存放数值的长度
{
if(0 == j || S[i] == T[j]){
i++;
j++;
}else{
j = next[j];
}
}
if(j>T[0]) return i-T[0];
else return 0;
}