C语言编写算法,求目的串T在源串S中出现的所有位置
时间: 2024-11-27 07:21:54 浏览: 12
在C语言中,要寻找字符串`T`在字符串`S`中出现的所有位置,可以使用KMP(Knuth-Morris-Pratt)搜索算法或者Boyer-Moore搜索算法,这两种算法都比较高效。以下是使用KMP算法的一个简单示例:
```c
#include <stdio.h>
#include <string.h>
// KMP辅助函数 - 构建next数组
void getNext(char *pattern, int next[], int m) {
int j = 0;
next[0] = -1; // 空字符串的next值为-1
for (int i = 1; i < m; i++) {
while (j > 0 && pattern[i] != pattern[j]) {
j = next[j - 1];
}
if (pattern[i] == pattern[j]) {
j++;
}
next[i] = j;
}
}
// KMP搜索函数
void kmpSearch(char *text, char *pattern, int m, int n) {
int j = 0; // KMP指针
int index[m]; // 存储匹配的位置
getNext(pattern, next, m); // 初始化next数组
for (int i = 0; i < n; i++) {
while (j > 0 && text[i] != pattern[j]) {
j = next[j - 1];
}
if (text[i] == pattern[j]) {
j++;
}
if (j == m) { // 找到一个完整匹配
printf("Pattern found at position %d\n", i - m + 1);
j = next[j - 1]; // 继续从下一个位置开始查找
}
}
}
int main() {
char S[] = "Hello World, Hello Universe";
char T[] = "Hello";
int m = strlen(T);
int n = strlen(S);
kmpSearch(S, T, m, n);
return 0;
}
```
这个程序首先构建了模式串`T`的next数组,然后遍历文本串`S`,当遇到匹配的情况时,会打印出匹配的位置。
阅读全文