问题描述:
子数组和子串是连续的,子序列不一定连续。
示例:
输入:abcde ace
输出:3
输入:ALGORITHMS ALCHEMIST
输出:5(分别是ALHMS)
方法:借鉴B站UP主alchemist_dong的讲解视频,感谢。附上视频链接:最长公共子序列 - 动态规划 Longest Common Subsequence - Dynamic Programming_哔哩哔哩_bilibili
如有侵权,会主动删帖。以下是我听了视频后的理解。
- 按照行填
- 不匹配时取对角线最大值填,这是因为能确保当前填的数是两个字符前的最大匹配数
- 匹配时取斜对角线的值加1,这是因为能确保当前填的数是匹配前的最大匹配数
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<math.h>
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
char str1[81];
char str2[81];
int i, j, n, m;
int maxnum = 0;
printf("please input str1:");
gets(str1);
printf("please input str2:");
gets(str2);
int matrix[81][81] = { 0 };
for (i = 0; str1[i] != '\0'; i++) {
for (j = 0; str2[j] != '\0'; j++) {
if (str1[i] == str2[j]) {
matrix[i + 1][j + 1] = matrix[i][j] + 1;//因为i,j都是从0开始
//但是第0行和第0列初始化为0
}
else
{
matrix[i + 1][j + 1] = max(matrix[i][j + 1], matrix[i + 1][j]);
}
}
}
for (n = 0; n < i; n++) {//找二维数组中的最大值
for (m = 0; m < j; m++) {
if (maxnum < matrix[i][j]) {
maxnum = matrix[i][j];
}
}
}
printf("the longest Common Subsequence is %d\n", maxnum);
return 0;
}
运行结果截图:
如果该内容对你有小小的帮助,请给我点个赞!谢谢。