最长公共子序列-C++/C

文件main.c
#include <iostream>
#include <string.h>
#include <stdio.h>
#include "LCSLLength.h"
using namespace std;
int main(){
    char * x="ABCBDAB";
    char * y="BDCABA";
    LCSLLength L1(y,x);
    cout<<"L1.getLength() = "<<L1.getLength()<<endl;
    char *res=L1.getLCS();
    printf("\n%s\n",res);

    cout<<"\nhello world!!\n";
    return 0;
}
文件.h
#ifndef LCSLLENGTH_H
#define LCSLLENGTH_H
#include <iostream>
using namespace std;

class LCSLLength
{
    public:
        LCSLLength(char * x, char * y);
        virtual ~LCSLLength();
        int getLength();
        char* getLCS();
    protected:

    private:
        char *x;
        char *y;
        int size_x=0;
        int size_y=0;
        int flag[500][500];
};

#endif // LCSLLENGTH_H

文件.cpp

#include "LCSLLength.h"
#include "stdio.h"
#include "stdlib.h"
LCSLLength::LCSLLength(char *x , char *y)
{
    this->x = x;
    this->y = y;
    printf("%s\n",this->x);
    printf("%s\n",this->y);
    while(this->x[size_x]!='\0'){
        size_x++;
    }
    while(this->y[size_y]!='\0'){
        size_y++;
    }
    cout<<"x="<<size_x<<" and y="<<size_y<<endl;
}

LCSLLength::~LCSLLength()
{
    //dtor
}



//返回最长公共子序列长度, x,y
int LCSLLength::getLength(){
    printf("%s\n",x);
    printf("%s\n",y);

    int array[size_x+1][size_y+1]={0};  //保存标记
    int data[size_x+1][size_y+1]={0};   //保存长度

    for(int i=0; i<=size_x; i++){
        for(int j=0; j<=size_y; j++){

            if(i==0 || j==0){
                data[i][j]=0;
                array[i][j]=0;
            }
            else if(x[i-1] == y[j-1]){
//                    cout<<data[i-1][j-1]<<endl;
                data[i][j]=data[i-1][j-1]+1;
                array[i][j]=1;
            }
            else if(data[i-1][j] >= data[i][j-1]){
                data[i][j]=data[i-1][j];
                array[i][j]=3;
            }
            else{
                data[i][j]=data[i][j-1];
                array[i][j]=2;
            }
        }
    }
    cout<<"数组data"<<endl;
    for(int i=0; i<=size_x; i++){
        for(int j=0; j<=size_y; j++){
            cout<<data[i][j]<<"  ";
            flag[i][j] = array[i][j];
        }
        cout<<endl;
    }

    cout<<"数组array"<<endl;
    for(int i=0; i<=size_x; i++){
        for(int j=0; j<=size_y; j++){
            cout<<array[i][j]<<"  ";
        }
        cout<<endl;
    }
    return data[size_x][size_y];
}

char* LCSLLength::getLCS()
{
	char res[500];
	int i = size_x;
	int j = size_y;
	int k = 0;    ///用于保存结果的数组标志位

	while (i>0 && j>0)
	{
		if (flag[i][j] == 1)   ///如果是对角线标记
		{
			res[k] = x[i - 1];
			k++;
			i--;
			j--;
		}
		else if (flag[i][j] == 2)  ///如果是向左标记
		{
		    j--;
		}

		else if (flag[i][j] == 3)  ///如果是向上标记
		{
		    i--;
        }
	}
    printf("ok\n");
    char result[size_x+size_y];
    int a=0;
	for (i = k - 1; i >= 0; i--){
        result[a++]=res[i];
		printf("%c", res[i]);
	}   result[a]='\0';
    return result;
}

发布了97 篇原创文章 · 获赞 18 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_32460819/article/details/100713960