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算法
留坑~