模式匹配BF算法和KMP算法(C++实现)

本文介绍了BF算法(Brute Force)和KMP算法两种模式匹配方法,并提供了C++实现。BF算法采用蛮力比较,当匹配失败时回溯。而KMP算法通过next数组优化,避免了主串的回溯,提高了效率。
摘要由CSDN通过智能技术生成

模式匹配BF算法和KMP算法(C++实现)

BF算法:蛮力匹配,即从主串S的第一个字符开始和模式T的第一个字符进行比较,若相等,则继续比较后续字符,否则从S的第二个字符和T的第一个字符进行比较。直到S或T所有字符比较完毕。

基本思想

  1. 在串 S 和串 T 中设比较的起始下标 i 和 j;
  2. 循环直到 S 或 T 的所有字符均比较完
    2.1 如果S[i] 等于T[j],继续比较 S 和 T 的下一个字符;
    2.2 否则,将 i 和 j 回溯,准备下一趟比较;
  3. 如果T中所有字符均比较完,则返回匹配的起始比较下标;否则返回 0; KMP算法是对BF算法的改进,关键在不需回溯主串的i指针,且根据next数组的值移动子串的j指针。
int BF(char S[ ], char T[ ])
{
   
//	start:T在S开始匹配的位置,i,j分别是S和T匹配的下标 
    int i = 0, j = 0, start = 0;   
    while (S[i] != '\0' && T[j] != '\0')
    {
   
        if (S[i] == T[j]) {
    i++;   j++;}  // 匹配成功,则下标后移
        else {
    start++;  i = start;  j = 0; } // 匹配不成功,则回溯到start位置 
    }
    if (T[j] == '\0') return start + 1;   // 直到 T匹配完成,返回本趟开始匹配的位置 
    else return 0;
}

KMP算法是对BF算法的改进,关键在不需回溯主串的i指针,且根据next数组的值移动子串的j指针。
next[j]表示在匹配过程中与T[j]比较不相等时,下标 j 的回溯位置

基本思想:

  1. 在串 S 和串 T 中分别设比较的起始下标 i 和 j;
  2. 循环直到 S 或 T 的所有字符均比较完
    2.1 如果S[i]等于T[j],继续比较 S 和 T 的下一个字符;否则将 j 向右滑动到next[j]位置,即 j=next[j];
    2.2 如果 j=-1,则将 i 和 j 分别加 1,准备下一趟比较;
  3. 如果 T 中所有字符均比较完毕,则返回匹配的起始下标;否则返回 0;
//  KMP算法—先算出next[]数组 
int* getNext(char T[ ])
{
   
    int T_len = strlen(T);
    int* next = 
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值