最长公共子序列问题 算法导论15.4

// 算法导论 15.4 最长公共子序列问题  15.4-2
public class LongestCommonSubsequence {
  public static int lcsLength(char[] arrX, char[] arrY) { // O(m*n)
    System.out.println(Arrays.toString(arrX));
    System.out.println(Arrays.toString(arrY));
    int m = arrX.length;
    int n = arrY.length;
    int[][] resultC = new int[m + 1][n + 1];
    char[][] auxB = new char[m][n];
    for (int i = 0; i <= m; i++) {
      resultC[i][0] = 0;
    }
    for (int j = 0; j <= n; j++) {
      resultC[0][j] = 0;
    }
    for (int i = 1; i <= m; i++) {
      for (int j = 1; j <= n; j++) {
        int indX = i - 1;
        int indY = j - 1;
        if (arrX[indX] == arrY[indY]) {
          resultC[i][j] = resultC[i - 1][j - 1] + 1;
          auxB[indX][indY] = '\\';
        }
        else {
          int upRowLen = resultC[i - 1][j];
          int leftColLen = resultC[i][j - 1];
          if (upRowLen >= leftColLen) {
            resultC[i][j] = upRowLen;
            auxB[indX][indY] = '|';
          }
          else {
            resultC[i][j] = leftColLen;
            auxB[indX][indY] = '-';
          }
        }
      }
    }
    for (int i = 0; i <= m; i++) {
      System.out.println(Arrays.toString(resultC[i]));
    }
    for (int i = 0; i < m; i++) {
      System.out.println(Arrays.toString(auxB[i]));
    }

    printLcs(resultC, arrX, arrY, m, n);
    System.out.println();
    return resultC[m][n];
  }

  public static void printLcs(char[][] auxB, char[] arrX, int i, int j) {
    if (i == 0 || j == 0) {
      return;
    }
    if (auxB[i - 1][j - 1] == '\\') {
      printLcs(auxB, arrX, i - 1, j - 1);
      System.out.print(arrX[i - 1] + ",");
    }
    else {
      if (auxB[i - 1][j - 1] == '|') {
        printLcs(auxB, arrX, i - 1, j);
      }
      else {
        printLcs(auxB, arrX, i, j - 1);
      }
    }
  }

  public static void printLcs(int[][] result, char[] arrX, char[] arrY, int i, int j) {
    if (i == 0 || j == 0) {
      return;
    }
    if (arrX[i-1]== arrY[j-1] && (result[i][j] == result[i-1][j-1]+1)) {
      printLcs(result, arrX, arrY, i - 1, j - 1);
      System.out.print(arrX[i - 1] + ",");
    }
    else if (result[i][j] == result[i - 1][j]) {
      printLcs(result, arrX, arrY, i - 1, j);
    }
    else if (result[i][j] == result[i][j - 1]) {
      printLcs(result, arrX, arrY, i, j - 1);
    }
  }

  public static void main(String[] args) {
    char[] arrayX = { 'A', 'B', 'C', 'B', 'D', 'A', 'B' };
    char[] arrayY = { 'B', 'D', 'C', 'A', 'B', 'A' };
    char[] arrayY1 = { 'B', 'D', 'C', 'A', 'B', 'A', 'B' };
    int lcsLen;
    lcsLen = lcsLength(arrayX, arrayY);
    System.out.println("Longest common subsequence:" + lcsLen);
    lcsLen = lcsLength(arrayX, arrayY1);
    System.out.println("Longest common subsequence:" + lcsLen);
    lcsLen = lcsLength(arrayY, arrayY1);
    System.out.println("Longest common subsequence:" + lcsLen);
  }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值