最长公共子序列LCS

简介: 时间限制:1 秒 空间限制:65536 KB 分值: 0给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。比如两个串为:abcicbaabdkscabab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。Input第1行:字符串A第2行:字符串B(A,B的长度 <= 1000)Output输出最长
时间限制:1 秒 空间限制:65536 KB 分值: 0
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:

abcicba
abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input

第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)

Output

输出最长的子序列,如果有多个,随意输出1个。

Input 示例

abcicba
abdkscab

Output 示例

abca
动态规划的一个计算两个序列的最长公共子序列的方法如下:
以两个序列 X、Y 为例子:
设有二维 数组f[i,j] 表示 X 的 i 位和 Y 的 j 位之前的最长公共子序列的长度,则有:
f[1][1] = same(1,1);
f[i,j] = max{f[i-1][j -1] + same(i,j),f[i-1,j],f[i,j-1]}
其中,same(a,b)当 X 的第 a 位与 Y 的第 b 位相同时为“1”,否则为“0”。
此时,二维数组中最大的数便是 X 和 Y 的最长公共子序列的长度,依据该 数组回溯,便可找出最长公共子序列。
该算法的空间、 时间复杂度均为O(n^2),经过优化后, 空间复杂度可为O(n)。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str1[1002],str2[1002];
int d[1002][1002];
int main()
{
    while(gets(str1) && gets(str2))
    {
        int len1=strlen(str1),len2=strlen(str2);
        memset(d,0,sizeof(d));
        for(int i=len1-1; i>=0; i--)
            for(int j=len2-1; j>=0; j--)
            {
                if(str1[i]==str2[j])
                    d[i][j]=d[i+1][j+1]+1;
                else
                    d[i][j]=max(d[i+1][j],d[i][j+1]);
            }
       int i = 0, j = 0;
        while (i < len1 && j < len2){
            if (str1[i] == str2[j]){
            printf("%c",str1[i]);
                i++;
                j++;
            }
            else if (d[i+1][j] >= d[i][j+1])
                i++;
            else
                j++;
        }
        printf("\n");
    }
    return 0;
}


目录
相关文章
|
9月前
1265:【例9.9】最长公共子序列 2021-01-15
1265:【例9.9】最长公共子序列 2021-01-15
|
10月前
深入理解动态规划算法 | 最长公共子序列LCS
深入理解动态规划算法 | 最长公共子序列LCS
80 0
最长公共子序列(一 | 计算长度版)
最长公共子序列(一 | 计算长度版)
|
算法 BI
最长公共子序列(三 | 存在多个解的情况)
最长公共子序列(三 | 存在多个解的情况)
|
人工智能 Java
LCS最长公共子序列
例如 b c d d e和 a c e e d e的公共子串为c d e。 如果使用暴力,复杂度太高会直接超时。就需要使用动态规划
73 0
1143. 最长公共子序列
1143. 最长公共子序列
87 0
1143. 最长公共子序列
最长公共子序列(LCS)
最长公共子序列(Longest Common Subsequence,LCS),顾名思义,是指在所有的子序列中最长的那一个。子串是要求更严格的一种子序列,要求在母串中连续地出现。这里给出一个例子:有两个母串cnblogs与belong。