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. elk-安装 通过docker

      一. github地址   https://github.com/deviantony/docker-elk   cd /usr/local/src   git clone https://git ...

  2. spring boot:thymeleaf模板中insert/include/replace三种引用fragment方式的区别(spring boot 2.3.3)

    一,thymeleaf模板中insert/include/replace三种引用fragment方式的区别 insert: 把整个fragment(包括fragment的节点tag)插入到当前节点内部 ...

  3. centos8平台使用wkhtmltopdf实现html网页转pdf

    一,wkhtmltopdf的用途 wkhtmltopdf可以直接把任何一个可以在浏览器中浏览的网页直接转换成一个pdf 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnb ...

  4. <转>二十问全链路压测干货汇总(上)

    本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...

  5. 数据库备份作业的T-SQL语句

    1.关于大容量数据导入导出的一些方法SQL SERVER提供多种工具用于各种数据源的数据导入导出,这些数据源包括本文文件.ODBC数据源.OLE DB数据源.ASCII文本文件和EXCEL电子表格.2 ...

  6. 智能DNS的实现

    网络路径远,导致用户访问延迟 各个运营商之间的带宽有阀口. GSLB 就近的返回服务器的地址 CDN网络 内容分发网络 Content Delivery Network CND服务商 阿里 腾讯 蓝汛 ...

  7. Codeforces Round 662 赛后解题报告(A-E2)

    Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...

  8. 闭包 - Js函数笔记

    闭包 当函数被保存到外部时,将会生成闭包 闭包会导致原有作用域链不释放,造成内存泄漏 类似的代码就叫闭包 闭包的运行作用域 代码 a被执行,b被定义并保存出来 a结束,b被执行时,a的执行期上下文指向 ...

  9. vue 组件传值,(太久不用就会忘记,留在博客里,方便自己查看)

    一 :父组件 传值给 子组件 方法: props //父组件 <template lang="html"> <div> <h3>我是父亲< ...

  10. css-设置背景透明度

    实现透明的css方法通常有以下3种方式,以下是不透明度都为80%的写法: css3的opacity:x,x 的取值从 0 到 1,如opacity: 0.8 兼容性:IE6.7.8不支持,IE9及以上 ...