假设现在有这样一个问题:有一个文本串S,和一个模式串P,现在要判断S中是否有和P匹配的子串,并查找P在S中的位置,怎么解决呢?这篇文章就为大家介绍了关于这个问题求解的两种算法。
一、BF算法
BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。
代码实现:
#include<stdio.h>
#include<string.h>
int BFMatch(char* s,char* p)
{
int i,j;
i = 0;
//第一层循环,i不断遍历
while(i < strlen(s))
{
j = 0;//当遇到不匹配的时候j又回溯
while(s[i] == p[j] && j<strlen(p))
{
i++;
j++;
}
if(strlen(p) == j)//字符串匹配成功
{
return i - strlen(p);//返回匹配字符串位置
}
i = i-j+1;//若没有匹配成功,i回退到本次匹配的开始位置
}
return -1;
}
int main()
{
char* s1 = "ababab";
char* s2 = "baba";
int index = BFMatch(s1,s2);
printf("目标串包含匹配串的起始位置:%d",index);
}
解析:BF匹配步骤如下:
二、KMP算法
KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。在匹配成功的自传中找到两个最长相等的真子串。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。
具体解析见字符串匹配KMP详解