(二)、串的模式匹配
设有两个串s和t(顺序存储),串t的定位就是要在串s中找到一个与t相等的子串。通常把s称为目标串(target string),把t称为模式串(pattern str ing),故串定位查找也称为模式匹配(pattern matching)。模式匹配成功是指在目标串s中找到了一个模式串t;不成功则指目标串s中不存在模式串t。
1.Brute-Force算法
int index(SqString s,Sqstring t)
{
int i,j,k;
for (i=0;i<=s.length-t.length;i++)
{
for (k=i,j=0; k<s.length && j<t.length && s.data[k]==t.data[j]; k++,j++);
if (j==t.length)
return(i);
}
return(-1);
}
int BF(SqString s,Sqstring t)
{
int i=0,j=0;
while (i<s.length && j<t.length)
{
if (s.data[i]==t.data[j])
{i++; //主串和子串依次匹配下一个字符
j++;
}
else //主串、子串指针回溯重新开始下一次匹配
{
i=i-j+1; //主串从下一个位置开始匹配
j=0; //子串从头开始匹配
}
}
if (j>=t.length) //或者if (j==t.length)
return(i-t.length); //返回匹配的第一个字符的下标
else
return(-1); //模式匹配不成功
}
- BF算法分析:
算法在字符比较不相等,需要回溯(即i=i-j+1):即退到s中的下一个字符开始进行继续匹配。
最好情况下的时间复杂度为O(m)。
最坏情况下的时间复杂度为O(nxm)。
平均的时间复杂度为O(nxm)。
2.KMP算法(找最长公共前后缀)
对于模式串T =‘abaabc'
当第6个元素匹配失败时,可令主串指针i不变,模式串指针j=3
当第5个元素匹配失败时,可令主串指针i不变,模式串指针j=2
当第4个元素匹配失败时,可令主串指针i不变,模式串指针j=2
当第3个元素匹配失败时,可令主串指针i不变,模式串指针j=1
当第2个元素匹配失败时,可令主串指针i不变,模式串指针j=1
当第1个元素匹配失败时,匹配下一个相邻子串,令j=0, i++,j++
- next数组
void getNext(Str substr, int next[])
{
int j=1, t;
next[1] = 0;
while(j < substr.length) //判断的是j+1的值,若条件为等于就越界了
{
if(t==0||substr.ch[j] == substr.ch[t]) //该判断包含了t等于0的情况
{
next[j+1] = t+1;
++t;
++j;
}
else
t = next[t];
}
}
int KMP(Str str, Str substr, int next[])
{
int i=1,j=1;
while(i<=str.length && j<=substr.length) //在主串和模式串的范围以内
{
if(j==0||str.ch[i]==substr.ch[j])
{
++i;
++j;
}
else
{
j=next[j];
}
}
if(j>substr.length)
return i-substr.length;
else
return 0;
}