最长公共子序列问题
来源:互联网 发布: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); }}
阅读全文
0 0
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- NOIP 2015 飞扬的小鸟
- kali初始化配置——更新
- js将数组转化成字符串
- APP版本号命名规范
- Vue 开发|文件目录结构部署
- 最长公共子序列问题
- 网络通信基础
- Spring定时任务
- Centos7下查看各进程的网络速率情况
- wsimport后如何为jax-ws设置timeout
- android7.0来电拦截
- 数值优化知识点
- eclipse老运行上一个程序之原因总结
- How to switch to the shell you want