(二)、串的模式匹配

设有两个串s和t(顺序存储),串t的定位就是要在串s中找到一个与t相等的子串。通常把s称为目标串(target string),把t称为模式串(pattern str ing),故串定位查找也称为模式匹配(pattern matching)。模式匹配成功是指在目标串s中找到了一个模式串t;不成功则指目标串s中不存在模式串t。

1.Brute-Force算法

数据结构(知识点碎片九)_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);
}

数据结构(知识点碎片九)_子串_02

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)