编辑代码

// // 最长公共子序列
#include<bits/stdc++.h>
using namespace std;
const int Size = 1010;   //尽量用全局变量
int DP[Size][Size];
int DIR[Size][Size];    
int LCS_length(string a, string b)
{
    int M = a.size();
    int N = b.size();
    for(int i=1; i<=M; i++)
    {
        for(int j=1; j<=N; j++)
        {
            if(a[i-1] == b[j-1]) 
            {
                DP[i][j] = DP[i-1][j-1] + 1;
                DIR[i][j] = 1;
            }
            else if(DP[i-1][j] >= DP[i][j-1])
            {
                DP[i][j] = DP[i-1][j];
                DIR[i][j] = 2;
            }
            else
            {
                DP[i][j] = DP[i][j-1];
                DIR[i][j] = 3;
            }
        }
    }
    return DP[M][N];
}
void LCS(string a, int i, int j)
{
    if(i==0 || j==0) return;
    if(DIR[i][j] == 1) 
    {
        LCS(a, i-1, j-1);
        cout<<a[i-1];  //a[i-1]==b[j-1]
    }
    else if(DIR[i][j]==2) LCS(a, i-1, j);
    else if(DIR[i][j]==3) LCS(a, i, j-1);
}
void LCS2(string a, string b, int i, int j)  //算法改进,不使用DIR数组,仅仅依靠DP数组以及a,b两个序列
{
    if(i==0 || j==0) return;
    if(a[i-1]==b[j-1])
    {
        LCS2(a, b, i-1, j-1);
        cout<<a[i-1]<<endl;
    }
    else if(DP[i-1][j] > DP[i][j-1]) LCS2(a, b, i-1, j);
    else LCS2(a, b, i, j-1);
}
int main()
{
    string a, b;
    cout<<"请输入两个字符串:"<<endl;
    while(cin>>a>>b && a!="GG")
    {
        cout<<"最大公共子序列长度为:"<<LCS_length(a, b)<<endl;
        // LCS(a, a.size(), b.size());
        cout<<"最大公共子序列为:";
        LCS2(a, b, a.size(), b.size());
        cout<<endl<<"请输入两个字符串:"<<endl;
    }
    system("pause");
    return 0;
}