最长公共子序列 Lcs

这个解释挺容易理解的:

过程详解

 最长公共子序列Lcs

给出两个字符串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

代码如下:

需要注意的是,它是随机输出的一组最长公共子序列,以测试样例为例,如果

void LcsLength(int m,int n)
函数里的
else if(num[i - 1][j] > num[i][j - 1])
改为
else if(num[i - 1][j] >= num[i][j - 1])

那输出的就是abcb了,卡在这里好久。。。。。

心塞。

#include<iostream>
#include<cstring>
using namespace std;
char a[1002],b[1002];
int num[1002][1002];
int flag[1002][1002];
void LcsLength(int m,int n)
{
    int i,j;
    for(i = 1;i <= m;i++)
    for(j = 1;j <= n;j++)
    {
        if(a[i] == b[j])
        {
            num[i][j] = num[i - 1][j - 1] + 1;
            flag[i][j] = 1;
        }
        else if(num[i - 1][j] > num[i][j - 1])
        {
            num[i][j] = num[i - 1][j];
            flag[i][j] = 2;
        }
        else
        {
            num[i][j] = num[i][j -1];
            flag[i][j] = 3;
        }
    }
}

void Lcs(int i,int j)
{
    if(i == 0 || j == 0)
    return ;
    if(flag[i][j] == 1)
    {
        Lcs(i - 1,j - 1);
        cout << a[i];
    }
    else if(flag[i][j] == 2)
    Lcs(i - 1,j);
    else
    Lcs(i,j - 1);
}

int main()
{
    cin >> a + 1 >> b + 1;
    int m = strlen(a + 1);
    int n = strlen(b + 1);
    LcsLength(m,n);
    Lcs(m,n);
    return 0;
}
/*
Sample Input
abcicba
abdkscab
Sample Output
abca
*/


猜你喜欢

转载自blog.csdn.net/qq_41929449/article/details/79947717