LCS最大公共子序列

#include<iostream>
#include<string.h>

using namespace std;

void LCS(char *str1,char *str2,int arr[50][50],char map[51][51])
{
    for(int i = 1;i <= strlen(str1) ; i++)
    {
        for(int j = 1;j <= strlen(str2) ; j++)
        {
            if(str1[i-1] == str2[j-1])
            {
                arr[i][j] = arr[i-1][j-1] + 1;
                map[i][j] = '\\';   //向上
            }
            else
            {
                if(arr[i-1][j] >= arr[i][j-1])
                {
                    arr[i][j] = arr[i-1][j];
                    map[i][j] = '|';
                }
                else
                {
                    arr[i][j] = arr[i][j-1];
                    map[i][j] = '-';
                }
            }
        }
    }
    for(int i=0;i<=strlen(str1);i++)
    {
        for(int j=0;j<=strlen(str2);j++)
        {
            cout<<arr[i][j]<<" ";
        }
        cout<<endl;
    }
    for(int i=0;i<=strlen(str1);i++)
    {
        for(int j=0;j<=strlen(str2);j++)
        {
            cout<<map[i][j]<<" ";
        }
        cout<<endl;
    }
}

void DFS_Printf(char *str1,char map[51][51],int len1,int len2)
{
    if(len1 == 0 || len2 == 0)
    {
        return ;
    }
    if(map[len1][len2] == '\\')
    {
        cout<<str1[len1-1];
        DFS_Printf(str1,map,len1-1,len2-1);
    }
    else if(map[len1][len2] == '|')
    {
        DFS_Printf(str1,map,len1-1,len2);
    }
    else
    {
        DFS_Printf(str1,map,len1,len2-1);
    }
}

int main()
{
    char map[51][51] = {0};
    int arr[50][50] = {0};
    char *str1="ABCBDAB";
    char *str2="BDCABA";
    LCS(str1,str2,arr,map);
    DFS_Printf(str1,map,strlen(str1),strlen(str2));
    return 0;
}

你可能感兴趣的:(LCS最大公共子序列)