最長公共子序列

 

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

 

 

完整程序:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include <string.h>
#include<bits/stdc++.h>
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<<"請輸入兩個字符串"<<endl;
   string x1,y1;
   cin>>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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章