最长公共子序列

最长公共子序列_第1张图片

最长公共子序列_第2张图片

最长公共子序列_第3张图片

最长公共子序列_第4张图片

 

0

1

2

3

4

...

n

0

0

0

0

0

0

0

1

0

 

 

 

 

 

 

2

0

 

 

 

 

 

 

3

0

 

 

 

 

 

 

4

0

 

 

 

 

 

 

 

 

 

 

 

 

m

0

 

 

 

 

 

 

 

 

 

0

1

2

3

4

5

6

 

 

yi

B

D

C

A

B

A

0

xi

0

0

0

0

0

0

0

1

A

0

0

0

0

1

1

1

2

B

0

1

1

1

1

2

2

3

C

0

1

1

2

2

2

2

4

B

0

1

1

2

2

3

3

5

D

0

1

2

2

2

3

3

6

A

0

1

2

2

3

3

4

7

B

0

1

2

2

3

4

4

 

 

 

0

1

2

3

4

5

6

 

 

yi

B

D

C

A

B

A

0

xi

 

 

 

 

 

 

 

1

A

 

2

B

 

3

C

 

4

B

 

5

D

 

6

A

 

7

B

 

 

最长公共子序列_第5张图片完整程序:

#include
#include
#include
#include 
#include
using namespace std;
//计算最长公共子序列的动态规划算法
#define NUM 100
int c[NUM][NUM];
int b[NUM][NUM];
void LCSLength(int m,int n,const char x[],char y[])
{
int i,j;
//数组c的第0行、第0列置0
for (i =1;i<=m;i++)
c[i][0]=0;
for(i =1;i<=n;i++)
        c[0][i] = 0;
//根据递推公式构造数组c
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
        {
            if (x[i]==y[j])
{
    c[i][j]=c[i-1][j-1]+1;
    b[i][j]=1;
    }//↖
            else if (c[i-1][j]>=c[i][j-1])
            {
                c[i][j]=c[i-1][j];    //↑
                b[i][j]=2;
            }
            else
            {
                c[i][j]=c[i][j-1];    //←
                b[i][j]=3;
            }
        }
}
void PrintLCS( const char x[], int i, int j)
{
    if(i == 0 || j == 0)
        return;
    if(b[i][j] == 1)
    {
PrintLCS(x,i-1,j-1);
        printf("%c ", x[i-1]);
    }
    else if(b[i][j] == 2)
        PrintLCS(x, i-1, j);
    else
        PrintLCS(x, i, j-1);
}
int main()
{
   // char x[NUM] = {"ABCBDAB"};
   // char y[NUM] = {"BDCABA"};
   cout<<"请输入两个字符串"<>x1>>y1;
    char x[NUM];
   char y[NUM];
   strncpy(x,x1.c_str(),x1.length()+1);///s.c_str() 字符强制转化为字符串函数
   	///长度必须加1,\0还占一个位置
   	 strncpy(y,y1.c_str(),y1.length()+1);
    int m, n;
    m = strlen(x);
    n = strlen(y);
    LCSLength(m,n,x,y);
    PrintLCS(x, m, n);
    return 0;
}

 

你可能感兴趣的:(算法分析与设计)