#include <stdio.h>
#include <string.h>
#define MAXLEN 100
void LCS(char str1[], char str2[], char result[]);
void LCS_helper(char str1[], char str2[], int len1, int len2, char result[]);
int main()
{
char str1[MAXLEN], str2[MAXLEN], result[MAXLEN];
printf("输入第一个字符串:\n");
fgets(str1, MAXLEN, stdin); // 读入字符串1
str1[strlen(str1)-1] = '\0'; // 去掉字符串1的最后一个字符(换行符)
printf("输入第二个字符串:\n");
fgets(str2, MAXLEN, stdin); // 读入字符串2
str2[strlen(str2)-1] = '\0'; // 去掉字符串2的最后一个字符(换行符)
LCS(str1, str2, result); // 调用LCS函数计算最长公共子序列
printf("最长公共子序列为:%s\n", result); // 输出结果
return 0;
}
void LCS(char str1[], char str2[], char result[])
{
int len1 = strlen(str1);
int len2 = strlen(str2);
LCS_helper(str1, str2, len1, len2, result); // 调用LCS_helper函数计算最长公共子序列
}
void LCS_helper(char str1[], char str2[], int len1, int len2, char result[])
{
if (len1 == 0 || len2 == 0) { // 如果有一个序列为空,则最长公共子序列为空
result[0] = '\0';
} else if (str1[len1-1] == str2[len2-1]) { // 如果序列1和序列2的最后一个元素相同,则最长公共子序列为去掉最后一个元素后的序列的最长公共子序列加上最后一个元素
char temp[MAXLEN];
strncpy(temp, str1, len1-1); // 去掉序列1的最后一个元素
temp[len1-1] = '\0'; // 添加字符串结束符
char temp2[MAXLEN];
strncpy(temp2, str2, len2-1); // 去掉序列2的最后一个元素
temp2[len2-1] = '\0'; // 添加字符串结束符
LCS_helper(temp, temp2, len1-1, len2-1, result); // 递归调用LCS_helper函数
result[strlen(result)] = str1[len1-1]; // 将最后一个元素添加到结果中
result[strlen(result)+1] = '\0'; // 添加字符串结束符
} else { // 如果序列1和序列2的最后一个元素不同,则最长公共子序列为去掉最后一个元素后的序列的最长公共子序列的长度较大者
char result1[MAXLEN], result2[MAXLEN];
LCS_helper(str1, str2, len1-1, len2, result1); // 计算去掉序列1的最后一个元素后的序列和序列2的最长公共子序列
LCS_helper(str1, str2, len1, len2-1, result2); // 计算去掉序列2的最后一个元素后的序列和序列1的最长公共子序列
if (strlen(result1) > strlen(result2)) {
strcpy(result, result1);
} else {
strcpy(result, result2);
}
}
}