模式匹配是字符串处理过程中经常要用到的算法(所谓的模式匹配就是查找一个串s2是不是s1的子串),所以,掌握模式匹配非常有用,下面来说道说道。
模式匹配主要由两种算法,BF算法和KMP算法。
一、BF算法
大家最容易想到的就是BF算法,查找一个串s2是不是另一个串s1的子串,那就和s1的每一个长度和s2相等的子串比较呗,的确是这样,思路简单,直接贴代码:
//这里s是主串,p是模式串,如果是子串,则返回在主串中曲线的位置,如果不是,返回-1
int BFMatch(char *s,char *p)
{
int i,j;
i=0;
while(i<strlen(s))
{
j=0;
while(s[i]==p[j]&&j<strlen(p))
{
i++;
j++;
}
if(j==strlen(p))
return i-strlen(p);
i=i-j+1; //指针i回溯
}
return -1;
}
二、KMP算法
实在是佩服想出来这个算法的人,常人无法理解!由于不是很懂,所以无法进行深入的讲解,下面简单说一下。
在KMP算法中,为了确定在匹配不成功时,下次匹配时j的位置,引入了next[]数组,next[j]的值表示P[0...j-1]中最长后缀的长度等于相同字符序列的前缀。
对于next[]数组的定义如下(字符串的下标都从0开始的情况):
1) next[j] = -1 j = 0
2) next[j] = max(k): 0<k<j P[0...k-1]=P[j-k,j-1]
3) next[j] = 0 其他
如:
P a b a b a
j 0 1 2 3 4
next -1 0 0 1 2
即next[j]=k>0时,表示P[0...k-1]=P[j-k,j-1]
因此KMP算法的思想就是:在匹配过程称,若发生不匹配的情况,如果next[