数据结构(知识点碎片九)

76 阅读2分钟

(二)、串的模式匹配

设有两个串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;
}