(二)、串的模式匹配
设有两个串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)。