算法:Common Subsequence(动态规划 Java 最长子序列)
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
求最大子序列的问题:
递推关系:c[][]存储最长子序列长度
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 最长子序列)的更多相关文章
- HDU 1159 Common Subsequence 动态规划
2017-08-06 15:41:04 writer:pprp 刚开始学dp,集训的讲的很难,但是还是得自己看,从简单到难,慢慢来(如果哪里有错误欢迎各位大佬指正) 题意如下: 给两个字符串,找到其中 ...
- hdu1422重温世界杯(动态规划,最长子序列)
重温世界杯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- nyoj 17-单调递增最长子序列 && poj 2533(动态规划,演算法)
17-单调递增最长子序列 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:21 submit:49 题目描述: 求一个字符串的最长递增子序列的长度 如 ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- hdu 1159:Common Subsequence(动态规划)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU 1159 Common Subsequence (动态规划、最长公共子序列)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 算法-最长子序列和C/C++实现(三个复杂度)
最长子序列和的问题非常easy: 就是一个数组,求出当中当中连续的某一段和,而这一段和是全部的连续段和的最大的值.求出这个值. 先说复杂度最高的:O(n3) 直接上代码,非常easy的: // // ...
- 动态规划 Common Subsequence
描述 A subsequence of a given sequence is the given sequence with some elements (possible none) left o ...
- Common Subsequence 最大公共子序列问题
Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...
随机推荐
- spring boot:用rocketmq消息订阅实现删除购物车商品功能(spring boot 2.3.3)
一,为什么要使用消息队列实现删除购物车商品功能? 消息队列主要用来处理不需要立刻返回结果的业务, 常见的例子: 用户在下单后,要清除原购物车中的商品, 这个处理过程不需要马上实现也不需要返回结果给用户 ...
- 第十二章 配置vlan
一.vlan技术简介 1.广播风暴 广播风暴(broadcast storm)简单的讲是指当广播数据充斥网络无法处理,并占用大量网络带宽,导致正常业务不能运行,甚至彻底瘫痪,这就发生了"广播 ...
- Python列表的增删改查
列表的增: li = ['libai','sushi','dufu','sushi',"白居易"] 第一种: append():向列表末尾追加元素 li.append('diaoc ...
- vue知识点11
1. Vue.js 是什么 Vue是一套用于构建用户界面的渐进式框架 2. vue的环境搭建(Vue2 ) 3. 经典的hello world new Vue({ ...
- 面试题 02.02. [链表][双指针]返回倒数第 k 个节点
面试题 02.02. 返回倒数第 k 个节点 方法一:使用外部空间 // 执行用时: 1 ms , 在所有 Java 提交中击败了 16.75% 的用户 // 内存消耗: 36.8 MB , 在所有 ...
- C# 编译器对局部变量的优化
C# 编译器对局部变量的优化 C# 的编译器可以对代码进行优化,所以,我们在写代码的时候,可以更多地考虑一下代码的易读性问题. 不考虑基本的对齐和换行美化.看一下局部变量优化问题. C# 示例代码 例 ...
- 使用 beeline 连接 hive 数据库报错处理
一.beeline连接hive报错 1. User: root is not allowed to impersonate root (state=08S01,code=0) 在初次搭建完hadoop ...
- Java8新特性探索之函数式接口
一.为什么引入函数式接口 作为Java函数式编程爱好者,我们都知道方法引用和 Lambda 表达式都必须被赋值,同时赋值需要类型信息才能使编译器保证类型的正确性. 我们先看一个Lambda代码示例: ...
- CodeForces 1408I Bitwise Magic
题意 给定三个整数 \(n,k,c\) 和一个长度为 \(n\) 的序列 \(a\),保证 \(a_i\) 互不相同.可以操作 \(k\) 次,每次随机选择一个 \(a_i\) 变成 \(a_i-1\ ...
- Vue+Antd搭配百度地图实现搜索定位等功能
前言 最近,在做vue项目的时候有做到选择地址功能,而原项目中又引入了百度地图,所以我就打算通过使用百度地图来实现地址搜索功能啦. 本次教程可能过于啰嗦,所以这里先放上预览地址供大家预览--点我预览, ...