最长公共子序列【东北大学oj数据结构10-3】C++

题面

对于给定两个序列 X 和 Y , 序列 Z 是 X 和 Y 的公共子序列是指如果 Z 同时是 X 和 Y 的子序列。

例如:如果 X = {a, b, c, b, d, a, b} 和 Y = {b, d, c, a, b, a} ,

那么序列 {b, c, a} 是 X 和 Y 的一个公共子序列。

但是序列 { b , c, a } 不是 X 和 Y 的最长公共子序列(LCS) , 因为它的长度是3。

而序列 {b,c,b,a} ( X 和 Y 都有这个序列)的长度是 4, 又没有长度大于或等于 5 的公共子序列,所以序列 {b,c,b,a} 是 X 和 Y 的最长公共子序列。

编写一个程序,找出给定的两个序列 X 和 Y 的LCS的长度。

输入

输入由多个数据集组成。

在第一行中,给出了一个整数 q,它是数据集的数量。

在下面的 2 × q 行中,给出了由两个序列 X 和 Y 组成的每个数据集。

输出

对于每个数据集,在一行中打印 X 和 Y 的 LCS 长度。

约束

1≤q≤150

1≤X和Y的长度≤1000

如果数据集包含长度大于100的序列,则Q≤20

输入样例

3

abcbdab

bdcaba

abc

abc

abc

bc

输出样例

4

3

2

代码
cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
 
using namespace std;
 
int main() {
    int n;
    cin >> n;
    for(int i=0;i<n;i++)
    {
        string a;
        string b;
        cin>>a>>b;
        int x=a.size();
        int y=b.size();
        vector<vector<int> > dq(x+1,vector<int>(y+1,0));
        for(int j=0;j<x;j++)
        {
            for(int k=0;k<y;k++)
            {
                if(a[j]==b[k])
                {
                    dq[j+1][k+1]=dq[j][k]+1;
                }
                else
                {
                    dq[j+1][k+1]=max(dq[j+1][k],dq[j][k+1]);
                }
            }
        }
        cout<<dq[x][y]<<endl;
    }
    return 0;
}
相关推荐
前端 贾公子2 分钟前
@uni-helper 社区:让 uni-app 拥抱 ESM 时代
开发语言·前端·javascript
wengqidaifeng3 分钟前
备战蓝桥杯----C/C++组 (一)所需C++基础知识(上)
c语言·数据结构·c++·蓝桥杯
弈风千秋万古愁4 分钟前
常见配置文件-AI辅助
开发语言·python
tankeven4 分钟前
HJ126 小红的正整数计数
c++·算法
不知名。。。。。。。。5 分钟前
仿muduo库实现高并发服务器-----Channel模块 和 Poller模块
开发语言·前端·javascript
Singe.Chen7 分钟前
C# 配置文件加密解密:最简便的实现方案
开发语言·网络协议·c#·信息与通信
花间相见7 分钟前
【JAVA基础01】——类和对象
java·开发语言·python
●VON8 分钟前
【鸿蒙PC】在 HarmonyOS 上跑 Electron?手把手教你搞定桌面欢迎页!(Mac版)
开发语言·macos·华为·electron·电脑·harmonyos
0 0 09 分钟前
CCF-CSP 37-2 机器人饲养指南(apple)【C++】考点:完全背包问题
开发语言·c++·算法
GIOTTO情10 分钟前
2026小红书投流新规下,基于Infoseek API的媒介投放自动化方案
java·linux·开发语言