字符串处理:布鲁特--福斯算法

Posted 南笺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串处理:布鲁特--福斯算法相关的知识,希望对你有一定的参考价值。

基本思想:

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

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

 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算法,其改进之处在于:每当匹配过程中出现相比较的字符不相等时,不需要回溯主串字符的位置指针。而是利用已经得到的“部分匹配”的结果,将模式串向后“滑动”尽可能远的距离,再继续进行比较。

以上是关于字符串处理:布鲁特--福斯算法的主要内容,如果未能解决你的问题,请参考以下文章

片段(Java) | 机试题+算法思路+考点+代码解析 2023

专家的修炼之路 —— 德雷福斯模型

CSP核心代码片段记录

javascript 肯特片段

比赛模考 2018.03.11 塞克斯斯

从搜索文档中查找最小片段的算法?