首页 > 技术文章 > 字符串处理:布鲁特--福斯算法

xiehuan-blog 2018-05-08 23:37 原文

基本思想:

其基本思想是从主串的第一个字符起与模式串的第一个字符比较,若相等,则继续逐个字符的后续比较,否则从主串的第二个字符起与模式串的第一个字符重新开始比较,直至模式串中的每个字符依次和主串中的一个连续的字符序列相等时为止,此时称为匹配成功,否则称为匹配失败。

以字符数组存储字符串,实现朴素的模式匹配算法。

 1 int Index(char S[], char T[], int pos)
 2 /*查找并返回模式串T在主串S中从pos开始的位置(下标),若T不是S的子串,则返回-1 */
 3 {
 4     i = pos; j=0;   // i , j 分别用于指示出主串字符和模式串字符的位置(下标)
 5     slen = strlen(S); tlen = strlen(T);   //计算主串和模式串的长度
 6     while(i < slen && j <tlen)
 7     {
 8         if(S[i] == T[j]) 
 9         {
10             i++;j++;
11         }
12         else
13         {
14             i = i - j + 1;   //主串字符的位置指针回退
15             j = 0;
16          }
17     }
18     if(j >= tlen)    //匹配成功
19         return i - tlen;
20     return -1;      //匹配失败,返回 - 1
21 }

时间复杂度:

在最好的情况下匹配算法的时间复杂度为O(n + m).最坏的情况下的时间复杂度为O( n × m),对该算法进行改进的模式匹配算法又称为KMP算法,其改进之处在于:每当匹配过程中出现相比较的字符不相等时,不需要回溯主串字符的位置指针。而是利用已经得到的“部分匹配”的结果,将模式串向后“滑动”尽可能远的距离,再继续进行比较。

推荐阅读