程序员
输入您的需求,我来帮您实现
以下是使用C语言实现KMP算法和字符串替换函数的示例代码:
#include <stdio.h>
#include <string.h>
// KMP算法
int kmp_search(char* text, char* pattern) {
int n = strlen(text);
int m = strlen(pattern);
int* lps = (int*)malloc(sizeof(int) * m);
int i = 0, j = 0;
int count = 0;
compute_lps(pattern, m, lps);
while (i < n) {
if (pattern[j] == text[i]) {
j++;
i++;
}
if (j == m) {
count++;
j = lps[j - 1];
}
else if (i < n && pattern[j] != text[i]) {
if (j != 0)
j = lps[j - 1];
else
i++;
}
}
free(lps);
return count;
}
void compute_lps(char* pattern, int m, int* lps) {
int len = 0;
int i = 1;
lps[0] = 0;
while (i < m) {
if (pattern[i] == pattern[len]) {
len++;
lps[i] = len;
i++;
}
else {
if (len != 0)
len = lps[len - 1];
else {
lps[i] = 0;
i++;
}
}
}
}
// 字符串替换函数
void replace_string(char* text, char* pattern, char* replace) {
int n = strlen(text);
int m = strlen(pattern);
int s = strlen(replace);
int count = kmp_search(text, pattern);
int* positions = (int*)malloc(sizeof(int) * count);
int i, j, k;
compute_positions(text, pattern, positions);
for (i = count - 1; i >= 0; i--) {
for (j = positions[i] + m - 1; j < n - m + s; j++) {
text[j + s - m] = text[j + 1];
}
for (k = 0; k < s; k++) {
text[positions[i] + k] = replace[k];
}
}
free(positions);
}
void compute_positions(char* text, char* pattern, int* positions) {
int n = strlen(text);
int m = strlen(pattern);
int* lps = (int*)malloc(sizeof(int) * m);
int i = 0, j = 0;
int count = 0;
compute_lps(pattern, m, lps);
while (i < n) {
if (pattern[j] == text[i]) {
j++;
i++;
}
if (j == m) {
positions[count] = i - j;
count++;
j = lps[j - 1];
}
else if (i < n && pattern[j] != text[i]) {
if (j != 0)
j = lps[j - 1];
else
i++;
}
}
free(lps);
}
int main() {
char text[100];
char pattern[100];
char replace[100];
printf("请输入主串T:");
scanf("%s", text);
printf("请输入模式串P:");
scanf("%s", pattern);
printf("请输入替换串S:");
scanf("%s", replace);
int count = kmp_search(text, pattern);
printf("匹配成功次数:%d
", count);
int* positions = (int*)malloc(sizeof(int) * count);
compute_positions(text, pattern, positions);
printf("P在T中的定位:");
for (int i = 0; i < count; i++) {
printf("%d ", positions[i]);
}
printf("
");
replace_string(text, pattern, replace);
printf("替换后的主串:%s
", text);
free(positions);
return 0;
}
你可以将以上代码保存为一个C文件,然后编译运行。在运行时,你需要依次输入主串T、模式串P和替换串S。程序将输出匹配成功次数、P在T中的定位以及替换后的主串。