当前位置:   article > 正文

【优选算法】—— 字符串匹配算法

【优选算法】—— 字符串匹配算法

在本期的字符串匹配算法中,我将给大家带来常见的两种经典的示例:

  • 1、暴力匹配(BF)算法
  • 2、KMP算法

目录

(一)暴力匹配(BF)算法

1、思想

2、演示

3、代码展示

(二)KMP算法

1、思想

2、演示

1️⃣ BF和KMP的区别

 2️⃣  K 的值求解

3️⃣ 求next数组的练习

3、代码展示

4、next数组的优化

(三)总结


(一)暴力匹配(BF)算法

1、思想

BF 算法,即 暴力 (Brute Force) 算法 ,是普通的模式匹配算法, BF 算法的思想:
  1. 就是将目标串S的第一个字符与模式串T 的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;
  2. 若不相等,则比较S的第二个字符和 T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。

2、演示

大家看到上诉这段话时肯定是晦涩难懂的,需要例子支持
下面我们就通过例子来解释这个问题:
  • 假定我们给出字符串ababcabcdabcde作为主串, 然后给出子串:abcd”;
  • 现在我们需要查找子串是否在主串中出现,出现返回主串中的第一个匹配的下标,失败返回-1 

  •  只要在匹配的过程当中,匹配失败,那么:i回退到刚刚位置的下一个,j回退到0下标重新开始

3、代码展示

  1. int BF(char *str,char *sub) //str:主串 sub:子串
  2. {
  3. assert(str != NULL && sub != NULL);
  4. if(str == NULL || sub == NULL)
  5. {
  6. return -1;
  7. }
  8. int i = 0;
  9. int j = 0;
  10. int strLen = strlen(str);
  11. int subLen = strlen(sub);
  12. while(i < strLen && j < subLen)
  13. {
  14. if(str[i] == sub[j])
  15. {
  16. i++;
  17. j++;
  18. }
  19. else
  20. {
  21. //回退
  22. i = i-j+1;
  23. j = 0;
  24. }
  25. }
  26. if(j >= subLen)
  27. {
  28. return i-j;
  29. }
  30. return -1;
  31. }
  32. int main()
  33. {
  34. printf("%d\n",BF("ababcabcdabcde","abcd"));
  35. printf("%d\n",BF("ababcabcdabcde","abcde"));
  36. printf("%d\n",BF("ababcabcdabcde","abcdef"));
  37. return 0;
  38. }

时间复杂度分析:最坏为 O(m*n); m 是主串长度, n 是子串长度

(二)KMP算法

1、思想

KMP 算法是一种改进的字符串匹配算法,由 D.E.Knuth J.H.Morris V.R.Pratt 提出的,因此人们称它为克努特 莫里斯— 普拉特操作(简称 KMP 算法)。 KMP 算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next() 函数实现, 函数 本身包含了模式串的局部匹配信息。 KMP 算法的 时间复杂度 O(m+n) [1]   。 来自 ------- 百度百科。

2、演示

1️⃣ BF和KMP的区别

区别 KMP BF 唯一不一样的地方在,我主串的 i 并不会回退,并且 j 也不会移动到 0 号位置

 首先举例,为什么主串不回退?

 的回退位置

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/592646
推荐阅读
相关标签