add
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#define MAX 100
|
||||
int getLCS(char* text1, char* text2) {
|
||||
int t1_len = strlen(text1);
|
||||
int t2_len = strlen(text2);
|
||||
int dp[MAX][MAX] = {0};
|
||||
for (int i = 1; i <= t1_len; i++) {
|
||||
for (int j = 1; j <= t2_len; j++) {
|
||||
if (text1[i - 1] == text2[j - 1]) {
|
||||
//找到一个 lcs 的元素,继续往前找
|
||||
dp[i][j] = 1 + dp[i - 1][j - 1];
|
||||
} else {//谁能让 lcs 最长,就取谁的值
|
||||
dp[i][j] = (dp[i - 1][j] > dp[i][j - 1])?
|
||||
dp[i - 1][j] : dp[i][j - 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
return dp[t1_len][t2_len];
|
||||
}
|
||||
|
||||
void getLCSTable(int dp[MAX][MAX], char* text1, char* text2, char b[MAX][MAX]) {
|
||||
int t1_len = strlen(text1);
|
||||
int t2_len = strlen(text2);
|
||||
for (int i = 1; i <= t1_len; i++) {
|
||||
for (int j = 1; j <= t2_len; j++) {
|
||||
if (text1[i - 1] == text2[j - 1]) {
|
||||
dp[i][j] = 1 + dp[i - 1][j - 1];
|
||||
b[i][j] = 'X'; // LCS元素,使用 'X' 作为占位符
|
||||
} else if (dp[i - 1][j] >= dp[i][j - 1]) {
|
||||
dp[i][j] = dp[i - 1][j];
|
||||
b[i][j] = '|'; // 取上面的值
|
||||
} else {
|
||||
dp[i][j] = dp[i][j - 1];
|
||||
b[i][j] = '-'; // 取左边的值
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void printLCSTable(char b[MAX][MAX], char* t1, char* t2, int l1, int l2) {
|
||||
printf("\t");
|
||||
for (int j = 0; j < l2; j++)
|
||||
printf("%c\t", t2[j]);
|
||||
printf("\n");
|
||||
for (int i = 0; i <= l1; i++) {
|
||||
printf("%c\t", (i == 0) ? ' ' : t1[i - 1]);
|
||||
for (int j = 0; j <= l2; j++) {
|
||||
if (i == 0 && j == 0) {
|
||||
printf("\t");
|
||||
} else {
|
||||
printf("%c\t", b[i][j]);
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
void printLCSString(char b[MAX][MAX], char* x, int i, int j) {
|
||||
if (i == 0 || j == 0) return;
|
||||
if (b[i][j] == 'X') {
|
||||
printLCSString(b, x, i - 1, j - 1);
|
||||
// 打印当前字符
|
||||
printf("%c", x[i - 1]);
|
||||
} else if (b[i][j] == '|') {
|
||||
printLCSString(b, x, i - 1, j);
|
||||
} else {
|
||||
printLCSString(b, x, i, j - 1);
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
char t1[] = "ABCB";
|
||||
char t2[] = "BDCA";
|
||||
printf("字符串: %s 和字符串: %s 的 LCS 长度为: %d\n", t1, t2, getLCS(t1, t2));
|
||||
printf("--------------------------------\n");
|
||||
int dp[MAX][MAX] = {0};
|
||||
char b[MAX][MAX] = {0};
|
||||
getLCSTable(dp, t1, t2, b);
|
||||
printLCSTable(b, t1, t2, strlen(t1), strlen(t2));
|
||||
printf("-------------------------------\n");
|
||||
|
||||
printf("LCS 字符串为: ");
|
||||
printLCSString(b, t1, strlen(t1), strlen(t2));
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,96 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
// 打印LCS的函数
|
||||
void PrintLCS(int path[][100], char *x, int i, int j) {
|
||||
if (i == 0 || j == 0) {
|
||||
return;
|
||||
}
|
||||
if (path[i][j] == 0) {
|
||||
PrintLCS(path, x, i - 1, j - 1);
|
||||
printf("%c", x[i - 1]);
|
||||
} else if (path[i][j] == 1) {
|
||||
PrintLCS(path, x, i - 1, j);
|
||||
} else {
|
||||
PrintLCS(path, x, i, j - 1);
|
||||
}
|
||||
}
|
||||
|
||||
// 找到LCS的长度
|
||||
int findLCS(int dp[][100], char *A, int n, char *B, int m) {
|
||||
// 初始化dp数组
|
||||
for (int i = 0; i <= n; i++) {
|
||||
for (int j = 0; j <= m; j++) {
|
||||
dp[i][j] = 0; // 数组初始化
|
||||
}
|
||||
}
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= m; j++) { // 执行状态转移方程
|
||||
if (A[i - 1] == B[j - 1]) {
|
||||
dp[i][j] = dp[i - 1][j - 1] + 1;
|
||||
} else {
|
||||
dp[i][j] = dp[i - 1][j] > dp[i][j - 1] ? dp[i - 1][j] : dp[i][j - 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
return dp[n][m];
|
||||
}
|
||||
|
||||
int main() {
|
||||
char x[] = "w8xta2px0i1jf4jfn8du8dk1fk2kvchd32";
|
||||
char y[] = "i3xsmdxwuv6a2yt520";
|
||||
|
||||
int m = strlen(x);
|
||||
int n = strlen(y);
|
||||
|
||||
// 创建二维数组
|
||||
int c[101][101]; // 101用于存储m+1和n+1的值
|
||||
int path[101][101]; // 路径数组
|
||||
|
||||
// 初始化二维数组
|
||||
for (int i = 0; i <= m; i++) {
|
||||
c[i][0] = 0;
|
||||
}
|
||||
for (int i = 0; i <= n; i++) {
|
||||
c[0][i] = 0;
|
||||
}
|
||||
|
||||
// 实现LCS逻辑
|
||||
for (int i = 1; i <= m; i++) {
|
||||
for (int j = 1; j <= n; j++) {
|
||||
if (x[i - 1] == y[j - 1]) {
|
||||
c[i][j] = c[i - 1][j - 1] + 1;
|
||||
} else if (c[i - 1][j] >= c[i][j - 1]) {
|
||||
c[i][j] = c[i - 1][j];
|
||||
path[i][j] = 1; // 来自上方
|
||||
} else {
|
||||
c[i][j] = c[i][j - 1];
|
||||
path[i][j] = -1; // 来自左侧
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 输出c数组
|
||||
printf("c:\n");
|
||||
for (int i = 0; i <= m; i++) {
|
||||
for (int j = 0; j <= n; j++) {
|
||||
printf("%d\t", c[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
// 输出path数组
|
||||
printf("path:\n");
|
||||
for (int i = 0; i <= m; i++) {
|
||||
for (int j = 0; j <= n; j++) {
|
||||
printf("%d\t", path[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
printf("%s与%s的最长公共子序列为:\n", x, y);
|
||||
PrintLCS(path, x, m, n);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAX_LENGTH 30 // 定义一个最大长度常量
|
||||
int main() {
|
||||
char s1[] = "abcdefg"; char s2[] = "cdefgh";
|
||||
// 获取字符串的长度
|
||||
int len1 = strlen(s1); int len2 = strlen(s2);
|
||||
// 使用固定大小的数组
|
||||
char s1_with_space[MAX_LENGTH]; char s2_with_space[MAX_LENGTH];
|
||||
// 填充带空格的字符串
|
||||
s1_with_space[0] = ' '; // 添加空格
|
||||
strcpy(s1_with_space + 1, s1); // 复制原字符串到新字符串
|
||||
s2_with_space[0] = ' '; // 添加空格
|
||||
strcpy(s2_with_space + 1, s2); // 复制原字符串到新字符串
|
||||
for (int i = 0; i <= len1; i++) { // 打印矩阵
|
||||
for (int j = 0; j <= len2; j++) {
|
||||
if (i == 0 && j <=len2) {
|
||||
printf("%c\t", s2_with_space[j]); // 打印第二行的字符
|
||||
} else if (j == 0 && i <= len1) {
|
||||
printf("%c\t", s1_with_space[i]); // 打印第一列的字符
|
||||
} else if (i > 0 && j > 0) {// 打印组合字符
|
||||
printf("%c%c\t", s1_with_space[i], s2_with_space[j]);
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
Reference in New Issue
Block a user