刷题日记 6
目录
题目描述
给定两个字符串 text1
和 text2
,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,ace
是 abcde
的子序列,但 aec
不是 abcde
的子序列。 两个字符串的 公共子序列是这两个字符串所共同拥有的子序列。
输入格式
字符串。
输出格式
字符串。
输入/输出样例
输入1
lijiji,ijij
输出1
4
解题思路
如图
主要就是这个表格,大家要会写出来的
总的来说就是,先初始化一个全为0的表格,如上图那样画,然后对比字母,如果相等就直接左上角的数值加1,如果不同,对比左边和正上方的数字,哪个大,填哪个。
代码
#include <stdio.h>
#include <string.h>
int main() {
char str1[100], str2[100], c;
int len1 = 1, len2 = 1, map[100][100] = {0}, ans = 0;
while ((c = getchar()) != ',') {
str1[len1] = c;
len1++;
}
while ((c = getchar()) != '\n') {
str2[len2] = c;
len2++;
}
for (int i = 1; i < len2; i++) {
for (int j = 1; j < len1; j++) {
if (str2[i] == str1[j]) {
map[i][j] = map[i - 1][j - 1] + 1;
if (map[i][j] > ans)
ans = map[i][j];
} else {
if (map[i - 1][j] > map[i][j - 1])
map[i][j] = map[i - 1][j];
else map[i][j] = map[i][j - 1];
if (map[i][j] > ans)
ans = map[i][j];
}
}
}
printf("%d", ans);
}
tip:如果运行没有结果,可以把 while ((c = getchar()) != '\n') 改成 while ((ch = getchar()) != EOF)
总结
积跬步行千里!
欢迎各位大佬斧正!