串匹配 Horspool和Boyer-Moore算法c++实现

Horspool算法

  • 算法思想参考的是《算法设计与分析基础 第3版》
  • 以全部为大写字母的给定串和模式串为例
  • 代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

int list[26];  //和26个字母索引对应

int CtoI(char ch)
{
    return ch - 'A';
}

char ItoC(int n)
{
    return 'A' + n;
}

//生成移动表
void ShiftTable(char* key)
{
    int i = 0;
    int m = strlen(key);
    // memset(list, m, 26);//对于整型数组,memset只能初始化化为0或者-1
    for(i = 0; i < 26; i++)
        list[i] = m;
    for(i = 0; i < m - 1; i++) {  //最后一个元素也是移动模式串的长度
        list[CtoI(key[i])] = m - i - 1;
    }
}

int HorspoolMatching(char* str, char* key)
{
    int i;
    int k;
    int m = strlen(key);
    int n = strlen(str);
    ShiftTable(key);  //根据key生成移动表
    i = m - 1;  //一开始对齐的时候模式串的最后一个元素对应的就是字符串的第m-1号
    while(i < n) {  //字符串边界
        k = 0;
        while(k < m && key[m - 1 - k] == str[i - k]) {  //从后往前开始比对
            k++;  //只要相同,继续往前比对
        }
        if(k == m)
            return i - m + 1;  //匹配上了,返回第一个元素对应的下标
        else
            i += list[CtoI(str[i])];  //往后移动
    }
    return -1;  //没有找到
}

int main(int argc, char* argv[])
{
    char str[] = "JIMOSAWOMEMINUAPBARBERSHOP";
    char key[] = "BARBER";
    int index = -2;
    index = HorspoolMatching(str, key);

    if(index != -1) {
        cout << index << endl;
    }
    else
        cout << "No Match!" << endl;

    return 0;
}

输出:

16

Boyer-Moore算法

留坑~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值