最长公共子序列问题

来源:互联网 发布:linux查看隐藏文件命令 编辑:程序博客网 时间:2024/06/14 15:20

题目描述:

给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:

abcicba
abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。


输入

第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)

输出

输出最长的子序列,如果有多个,随意输出1个。

输入示例


abcicba
abdkscab


输出示例

abca


import java.util.Scanner;public class LCS {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        char[] a = scanner.next().toCharArray();        char[] b = scanner.next().toCharArray();        int n1 = a.length;        int n2 = b.length;        if (n1 == 0 || n2 == 0) {            System.out.println(0);            return ;        }        int n = Math.max(n1, n2);        int[][] arr = new int[n + 1][n + 1];        int[][] bb = new int[n+1][n+1];        StringBuilder stringBuilder = new StringBuilder();        for (int i = 0; i <= n1; i++)            arr[i][0] = 0;        for (int i = 0; i <= n2; i++)            arr[0][i] = 0;        for (int i = 1; i <= n1; i++) {            for (int j = 1; j <= n2; j++) {                if (a[i - 1] == b[j - 1]) {                    arr[i][j] = arr[i - 1][j - 1] + 1;                    bb[i][j] = 0;                }                else if (arr[i-1][j] >= arr[i][j-1]){                    arr[i][j] = arr[i-1][j];                    bb[i][j] = 1;                } else {                    arr[i][j] = arr[i][j - 1];                    bb[i][j] = 2;                }            }        }        lcs(bb, a, n1, n2, stringBuilder);        System.out.println(stringBuilder.toString());    }    public static void lcs(int[][] b, char[] a, int i, int j, StringBuilder stringBuilder) {        if (i == 0 || j == 0)            return ;        if (b[i][j] == 0) {            lcs(b, a, i - 1, j - 1, stringBuilder);            stringBuilder.append(a[i-1]);        } else if (b[i][j] == 1) {            lcs(b, a, i-1, j, stringBuilder);        } else            lcs(b, a, i, j-1, stringBuilder);    }}


原创粉丝点击