求最长公共子序列长度

求最长公共子序列长度

题干

给定两个长度分别为 N 和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。

输入格式

第一行包含两个整数 N 和 M。

第二行包含一个长度为 N 的字符串,表示字符串 A。

第三行包含一个长度为 M 的字符串,表示字符串 B。

字符串均由小写字母构成。

输出格式

输出一个整数,表示最大长度。

数据范围

1≤N, M≤10001≤N, M≤1000

输入样例:

4 5
acbd
abedc

输出样例:

3

解法

  1. 采用动态规划法,两层循环遍历。f[N][N]表示当前字符串状态

  2. 伪代码:

    if a[i] = a[j]
    f[i][j] = f[i - 1][j - 1] + 1;
    else
    f[i][j] = max(f[i - 1][j], f[i][j + 1]);

  3. 代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1010;
    char a[N], b[N];
    int f[N][N];
    int n, m;
    int main(){
    scanf("%d%d", &n, &m);
    scanf("%s%s", a + 1, b + 1);
    for(int i = 1; i <= n; i ++)
    for(int j = 1; j <= m; j ++){
    if(a[i] == b[j]) f[i][j] = f[i - 1][j - 1] + 1;
    else f[i][j] = max(f[i - 1][j], f[i][j - 1]);
    }
    printf("%d", f[n][m]);
    return 0;
    }
posted @   ture?  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示