最长公共子序列LCS
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长公共子序列LCS相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章