用c语言写一个用了动态规划算法的字符串匹配代码
时间: 2024-02-16 09:00:38 浏览: 88
好的,以下是一个用动态规划算法实现的字符串匹配代码示例:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
int dp[MAX_LEN][MAX_LEN];
int max(int a, int b) {
return a > b ? a : b;
}
void lcs(char *str1, char *str2) {
int len1 = strlen(str1);
int len2 = strlen(str2);
int i, j;
// 初始化DP数组
for (i = 0; i <= len1; i++) {
dp[i][0] = 0;
}
for (j = 0; j <= len2; j++) {
dp[0][j] = 0;
}
// 填充DP数组
for (i = 1; i <= len1; i++) {
for (j = 1; j <= len2; j++) {
if (str1[i - 1] == str2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
// 输出最长公共子序列
int index = dp[len1][len2];
char lcs[index + 1];
lcs[index] = '\0';
i = len1;
j = len2;
while (i > 0 && j > 0) {
if (str1[i - 1] == str2[j - 1]) {
lcs[index - 1] = str1[i - 1];
i--;
j--;
index--;
} else if (dp[i - 1][j] > dp[i][j - 1]) {
i--;
} else {
j--;
}
}
printf("最长公共子序列为: %s\n", lcs);
}
int main() {
char str1[MAX_LEN], str2[MAX_LEN];
printf("请输入第一个字符串: ");
scanf("%s", str1);
printf("请输入第二个字符串: ");
scanf("%s", str2);
lcs(str1, str2);
return 0;
}
```
该代码实现了最长公共子序列(Longest Common Subsequence,简称LCS)的查找,其中用到了动态规划算法。具体来说,DP数组中存储的是str1和str2的前缀字符串的LCS长度,最终输出的是LCS本身。
阅读全文