码迷,mamicode.com
首页 > 其他好文 > 详细

最长公共子序列LCS

时间:2016-09-15 00:58:57      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

 1 package DynamicProgram;
 2 
 3 import org.junit.Test;
 4 
 5 
 6 public class LCS {
 7 
 8     // 输入两个序列,求最长公共子序列
 9     // b和c两个数组一个用来保存计算结果,一个用来保存路径
10     // 数组b中用1表示左上方,2表示上方,3表示左方
11     public void LcsLength(int [] rows, int [] cols, int [] [] b, int [] [] c) {
12         int rowsLength = rows.length;
13         int colsLength = cols.length;
14         for (int i = 1; i < rowsLength; ++i) {
15             for (int j = 1; j < colsLength; ++j) {
16                 if (rows[i] == cols[j]) {
17                     c[i][j] = c[i-1][j-1] + 1;
18                     b[i][j] = 1;
19                 }
20                 else if (c[i][j - 1] > c[i - 1][j]) {
21                     c[i][j] = c[i][j - 1];
22                     b[i][j] = 2;
23                 }
24                 else {
25                     c[i][j] = c[i - 1][j];
26                     b[i][j] = 3;
27                 }
28             }
29         }
30     }
31     
32     public void printLcs(int [] [] b, int [] rows, int i, int j) {
33         if (i == 0 || j == 0) {
34             return;
35         }
36         if (b[i][j] == 1) {
37             System.out.println((char) rows[i]);
38             printLcs(b, rows, i - 1, j - 1);
39         }
40         else if (b[i][j] == 2) {
41             printLcs(b, rows, i, j - 1);
42         }
43         else 
44             printLcs(b, rows, i - 1, j);
45             
46     }
47     
48     @Test
49     public void test() {
50         // 下标为0的索引值暂时不用
51         int [] cols = {-1, ‘A‘, ‘B‘, ‘C‘, ‘B‘, ‘D‘, ‘A‘, ‘B‘};
52         int [] rows = {-1, ‘B‘, ‘D‘, ‘C‘, ‘A‘, ‘B‘, ‘A‘};
53         // 准备工作
54         // 其实算法的空间复杂度可以进一步的优化
55         int rowsLength = rows.length;
56         int colsLength = cols.length;
57         // 声明两个m行n列的数组,这里是因为数组的下标0没有使用,否则的话需要数组的长度+1
58         // 用来记录一些额外的路径信息
59         int [][] path = new int [rowsLength][colsLength];
60         // 用来记录子问题,即最长子序列的长度
61         int [][] len = new int [rowsLength][colsLength];
62         for (int j = 0; j < rowsLength; ++j)
63             len[j][0] = 0;
64         for (int i = 0; i < colsLength; ++i)
65             len[0][i] = 0;
66         LcsLength(rows, cols, path, len);
67         //System.out.println(len[rowsLength - 1][colsLength - 1]);
68         // 注意这个打印出来的一个最优LCS的反序输出
69         printLcs(path, rows, rowsLength - 1, colsLength - 1);
70     }
71 }

 

最长公共子序列LCS

标签:

原文地址:http://www.cnblogs.com/wjf0/p/5873981.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!