Description

A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.

Input

The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.

Output

For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.

Sample Input

abcfbc         abfcab
programming contest
abcd mnp

Sample Output

4
2
0

Common Subsequence

求最大子序列的问题:

递推关系:c[][]存储最长子序列长度

$$ c[i][j] = \begin{cases} 0 &\ i = 0,\ \ j = 0 \\ c[i - 1][j - 1] + 1 &\ i > 0, j > 0; str\_x[i] = str\_y[j] \\ \max ( c[i][j - 1],\ c[i - 1][j] ) &\ i > 0, j > 0; str\_x[i] \ne str\_y[j] \end{cases} $$

AC代码:

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1, str2;
while (sc.hasNext()){
str1 = sc.next();
str2 = sc.next();
System.out.println(LcsLength(str1.toCharArray(), str2.toCharArray()));
}
sc.close();
} public static int LcsLength(char a[], char b[]){
int aL = a.length;
int bL = b.length;
int ans[][] = new int[aL + 1][bL + 1];
for (int i = 0; i <= aL; i++) {
ans[i][0] = 0;
}
for (int i = 0; i <= bL; i++) {
ans[0][i] = 0;
}
for (int i = 1; i <= aL; i++) {
for (int j = 1; j <= bL; j++) {
if (a[i - 1] == b[j - 1])
ans[i][j] = ans[i - 1][j - 1] + 1;
else if (ans[i][j - 1] >= ans[i - 1][j])
ans[i][j] = ans[i][j - 1];
else
ans[i][j] = ans[i - 1][j];
}
}
return ans[aL][bL];
}
}

可以输出最长子序列之一的代码:

import java.util.Scanner;

public class Main {

    public static int x[][];

    public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1, str2;
while (sc.hasNext()) {
str1 = sc.next();
str2 = sc.next();
System.out.println("最大子序列长度: " + LcsLength(str1.toCharArray(), str2.toCharArray()));
}
sc.close();
} public static int LcsLength(char a[], char b[]) {
int aL = a.length; // a数组的长度
int bL = b.length; // b数组的长度
int ans[][] = new int[aL + 1][bL + 1]; // 存储i,j当前的最长子序列长度
x = new int[aL + 1][bL + 1]; // 存储ans[i][j]是斜对角还是左边,上边来的
for (int i = 0; i <= aL; i++) {
ans[i][0] = 0; // 空的子序列都为0
}
for (int i = 0; i <= bL; i++) {
ans[0][i] = 0; // 空的子序列都为0
}
for (int i = 1; i <= aL; i++) {
for (int j = 1; j <= bL; j++) {
if (a[i - 1] == b[j - 1]) { // 判断字符是否相等
ans[i][j] = ans[i - 1][j - 1] + 1; // 相等长度加1
x[i][j] = 1; // 标记为相等斜着来的
} else if (ans[i][j - 1] >= ans[i - 1][j]) { // 左边大于上边就用最大的
ans[i][j] = ans[i][j - 1];
x[i][j] = 2; // 标记为左边来的
} else {
ans[i][j] = ans[i - 1][j];
x[i][j] = 3; // 标记为上边来的
}
}
}
System.out.print("最大子序列: ");
Lcs(aL, bL, a);
System.out.print('\n'); return ans[aL][bL];
}
// 递归输出最大子序列其中一个
public static void Lcs(int i, int j, char a[]) {
if (i == 0 || j == 0)
return;
if (x[i][j] == 1) {
Lcs(i - 1, j - 1, a);
System.out.print(a[i - 1]);
} else if (x[i][j] == 2)
Lcs(i, j - 1, a);
else if (x[i][j] == 3)
Lcs(i - 1, j, a);
}
}

算法:Common Subsequence(动态规划 Java 最长子序列)的更多相关文章

  1. HDU 1159 Common Subsequence 动态规划

    2017-08-06 15:41:04 writer:pprp 刚开始学dp,集训的讲的很难,但是还是得自己看,从简单到难,慢慢来(如果哪里有错误欢迎各位大佬指正) 题意如下: 给两个字符串,找到其中 ...

  2. hdu1422重温世界杯(动态规划,最长子序列)

    重温世界杯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  3. nyoj 17-单调递增最长子序列 && poj 2533(动态规划,演算法)

    17-单调递增最长子序列 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:21 submit:49 题目描述: 求一个字符串的最长递增子序列的长度 如 ...

  4. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  5. hdu 1159:Common Subsequence(动态规划)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  6. HDU 1159 Common Subsequence (动态规划、最长公共子序列)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. 算法-最长子序列和C/C++实现(三个复杂度)

    最长子序列和的问题非常easy: 就是一个数组,求出当中当中连续的某一段和,而这一段和是全部的连续段和的最大的值.求出这个值. 先说复杂度最高的:O(n3) 直接上代码,非常easy的: // // ...

  8. 动态规划 Common Subsequence

    描述 A subsequence of a given sequence is the given sequence with some elements (possible none) left o ...

  9. Common Subsequence 最大公共子序列问题

    Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...

随机推荐

  1. 【API管理 APIM】APIM中如何配置使用URL路径的方式传递参数(如由test.htm?name=xxx 变为test\xxx)

    问题描述 在默认的URL传递参数中,我们使用的是https://test01.azure-api.cn/echo/resource?param1=sample&param2=testname这 ...

  2. python numpy输出排名

    python numpy排序后输出排名 问题: 假设某班的成绩为: 姓名 成绩 名次 小红 95 小黑 67 小白 58 小绿 82 小蓝 76 小橙 79 小可爱 99 请根据表格,输出对应的名次 ...

  3. 建议你吃透python这68个内置函数!

    内置函数就是Python给你提供的, 拿来直接用的函数,比如print,input等. 截止到python版本3.6.2 ,一共提供了68个内置函数,具体如下 abs() dict() help() ...

  4. SELECT INTO与INSERT INTO SELECT用法

    SELECT INTO SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中: -- 创建 Websites 的备份,这种写法没走索引导致全表扫描 SELECT * INTO W ...

  5. 一份超全的Python学习资料汇总

    一.学习Python必备技能图谱二.0基础如何系统学习Python?一.Python的普及入门1.1 Python入门学习须知和书本配套学习建议1.2 Python简史1.3 Python的市场需求及 ...

  6. 正则表达式小应用之对xml格式字符串每个字段加双引号

    通过Python对接口进行自动化后需要把xml格式的报文放到LoadRunner上进行压力测试,在pyCharm控制台打印出报文后,把报文放到LoadRunner中做了格式调整后,每个字段需要添加双引 ...

  7. 【Flutter 混合开发】添加 Flutter 到 Android Fragment

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...

  8. Java学习的第四十三天

    1.例5.1数组元素的引用 public class cjava { public static void main(String[] args) { int i; int []a=new int[1 ...

  9. 使用AI技术获取图片文字与识别图像内容

    获取图片文字 如何使用python获取图片文字呢? 关注公众号[轻松学编程]了解更多- 1.通过python的第三方库pytesseract获取 通过pip install pytesseract导入 ...

  10. CF1324B

    感觉 \(O(tn^2)\) 不是正解,于是弱弱的发了一波 \(O(tn)\) . 题意描述 你谷还没有人翻译,这里就简单介绍一下. 给你一个长为 \(n\) 的序列,如果它的一个长度至少为 \(3\ ...