字符串匹配算法: 就是给定两个串,主串(s)和子串(sub), 查找子串是否在主串里面,如果找到便返回子串在主串中第一个元素的位置下标,否贼返回-1,。 在这里我
们讨论的时候主要用字符串来举例实现。 总共有两个算法,分别为BF算法和它的优化算法KMP算法。
首先我们来讲一下BF算法,BF 算 法 即 朴 素 算 法 :它 的 实 现 方 式 是 这 样 的 , 假 定 我 们 给 出 字 符串 ”ababcabcdabcde”作为主串, 然后给出子串: ”abcd”,现在我们需要查找子串是否在主串中出现, 出现返回主串中的第一个匹配的下标, 失败返回-1;
我们看上图,这是两个字符串,上面是主串,下面是子串,BF算法的基本原理用绿字写在旁边,大家可以动手画一下来体会这个过程。
那么,我用代码来实现一下BF算法函数:
int BF(Str *s,Str *sub,int pos)
{
if(pos<0||pos>s->length)
{
return -1;
}
int i = pos;//pos是传的参数,表示从主串的那个位置开始匹配
int j = 0;
int lens = s->length;
int lensub = sub->length;
while (i < lens && j < lensub)//进入while的条件是标记i和j都没有走完主串和子串
{
if (s->elem[i] == sub->elem[j])//字符相等
{
i++;
j++;
}
else//字符不相等
{
i = i - j + 1;//让i回到开始位置加1
的地方,继续匹配
j = 0;//让j指向子串的0号下标
}
}
if (j >= lensub)//这里做一个判断,j>=lensub的情况下就是在主串中找到了子串,就返回i-j,i是pos位置,减去j等于走了一个子串的长度。
{
return i - j;
}
else
return -1;
}
其实它函数就这么一点,很简单,很好理解。BF函数有三个参数,分别是主串(s),子串(sub)和从那个位置开始查找的一个整型变量(pos)。注释很详细。
KMP 算法: 相对于 BF 算法来说 KMP 算法更为高效, 原因在于 BF 算法的时间复杂度是:
O(mn),M 代表主串的长度, n 代表子串的长度。 而 KMP 的话, 时间复杂度就变为 O(m+n);接下来我们看一下, 具体的实现过程, 还是一样, 我们举例来看: KMP 和 BF 唯一不一样的地方在,主串的 i 并不会回退到开始的位置加1的地方, 并且 j 也不会移动到 0