顺序算法求最长公共串的C语言代码
时间: 2024-10-12 19:06:34 浏览: 38
在C语言中,我们可以使用动态规划的方法来求解两个字符串的最长公共子序列(LCS)。这里是一个简单的KMP(Knuth-Morris-Pratt)算法的简化版实现,它不是顺序的,因为KMP需要预处理模式串,但它避免了最坏情况下的回溯,比朴素的顺序搜索更有效率。
```c
#include <stdio.h>
#include <string.h>
void compute_lps(char *pattern, int lps[]) {
int len = strlen(pattern);
lps[0] = 0;
int index = 1;
while (index < len) {
if (pattern[index] == pattern[lps[index - 1]]) {
lps[index] = lps[index - 1] + 1;
index++;
} else {
if (lps[index - 1] != 0)
index = lps[index - 1];
else
lps[index] = 0;
}
}
}
int longest_common_subsequence(char *str1, char *str2) {
int m = strlen(str1);
int n = strlen(str2);
int lps[str2.length + 1]; // 记得计算长度
compute_lps(str2, lps);
int result = 0;
for (int i = 0; i <= m; i++) {
int k = lps[str2.length - 1];
while (k > 0 && str1[i + k - 1] != str2[n - k])
k = lps[k - 1];
if (str1[i + k - 1] == str2[n - k])
k++;
result = max(result, k);
}
return result;
}
int main() {
char str1[] = "ABCDGH";
char str2[] = "AEDFHR";
printf("Length of LCS is %d\n", longest_common_subsequence(str1, str2));
return 0;
}
```
注意,这个代码假设`str2.length + 1`是正确的数组大小,你需要先获取`str2`的实际长度。另外,`longest_common_subsequence`函数返回的是最长公共子序列的长度而不是子序列本身。
阅读全文