C实现Horspool字符串匹配 【输入形式】文本串和模式串(分开输入) 【输出形式】匹配成功,输出模式首字符对应文本的字符下标(从0开始);失败输出-1 同时输出字符比较次数 【样例输入】0001000000(文本) 100(模式) 【样例输出】3 7 (成功案例: 即匹配位置与比较次数,中间用空格隔开)
时间: 2024-03-05 09:53:29 浏览: 79
字符串匹配算法之Horspool算法
好的,以下是使用C语言实现Horspool字符串匹配的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1000
int horspool(char text[], char pattern[]) {
int m = strlen(pattern);
int n = strlen(text);
if (m > n) {
return -1;
}
int skip[256];
for (int i = 0; i < 256; i++) {
skip[i] = m;
}
for (int i = 0; i < m - 1; i++) {
skip[(int)pattern[i]] = m - i - 1;
}
int k = m - 1;
int comparisons = 0;
while (k < n) {
int j = m - 1;
int i = k;
while (j >= 0 && text[i] == pattern[j]) {
j--;
i--;
comparisons++;
}
if (j == -1) {
return i + 1;
}
k += skip[(int)text[k]];
}
return -1;
}
int main() {
char text[MAX_LEN];
char pattern[MAX_LEN];
scanf("%s%s", text, pattern);
int index = horspool(text, pattern);
if (index == -1) {
printf("%d", index);
} else {
printf("%d %d", index, strlen(pattern));
}
return 0;
}
```
这个程序使用了一个函数 `horspool` 来实现Horspool字符串匹配算法。该函数接受两个字符串参数 `text` 和 `pattern`,分别表示文本串和模式串。它返回一个整数,表示匹配成功时模式串首字符在文本串中的下标,匹配失败时返回 -1。
在主函数中,我们首先读入文本串和模式串,然后调用 `horspool` 函数得到匹配结果。如果匹配失败,我们直接输出 -1。如果匹配成功,我们输出模式串的长度和匹配位置。
注意,我们在 `horspool` 函数中使用了一个数组 `skip` 来记录每个字符在模式串中最右边的出现位置到模式串末尾的距离。这个数组的长度为 256,因为 ASCII 码总共有 256 个字符。在计算 `skip` 数组时,我们遍历模式串中除了最后一个字符以外的所有字符,记录每个字符在模式串中最右边的出现位置到模式串末尾的距离。最后一个字符在匹配时不需要跳过,因此它的距离被设为模式串的长度。在匹配时,我们按照 `skip` 数组中记录的距离来跳过文本串中的一些字符,从而提高匹配效率。
阅读全文