算法学习——LSC最大公有子序列 java实现
2014-04-03 10:41
274 查看
package com.stone.study.core; /** * * @ClassName LSC * @Description TODO * 最长公有子序列 * 算法类型:动态规划 * * 问题描述:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。 * 注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。 * 请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。 * 例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子序列,则输出它们的长度4,并打印任意一个子序列。 * * 转移方程: * dp[i,j] = 0 i=0 || j=0 * dp[i,j] = dp[i-1][j-1]+1 i>0,j>0, a[i] = b[j] * dp[i,j] = max(dp[i-1][j],dp[i][j-1]) i>0,j>0, a[i] != b[j] * * @author stone * @date:2014-4-3上午10:34:16 */ public class LSC { public static char[] s1 = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' }; public static char[] s2 = { 'b', 'c', 'a', 'e', 'f', 'g', 'h', 'a' }; /** * c[i][j]保存s1第0到i之间的字符串与s2第0到j之间的字符串,最长公有子串长度,因此c为[s1.length+1][s2.length+1] */ static int[][] c = new int[s1.length + 1][s2.length + 1]; /** * b[i][j]保存s1中第0到i之间的字符串与s2第0到j之间的字符串,最后一个字符针对最长公有子串的比较结果 */ static char[][] b = new char[s1.length + 1][s2.length + 1]; public static void main(String[] args) { lsc(); /* * 打印: 6 */ printLsc(); /* * 打印:bcefgh */ } /** * 计算子问题结果,并存入c数组中 */ public static void lsc() { for (int i = 0; i < c.length; i++) { c[i][0] = 0; } for (int j = 0; j < c[0].length; j++) { c[0][j] = 0; } int m = s1.length + 1; int n = s2.length + 1; for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { if (s1[i - 1] == s2[j - 1]) { c[i][j] = c[i - 1][j - 1] + 1; b[i][j] = s1[i - 1]; } else if (c[i][j - 1] >= c[i - 1][j]) { b[i][j] = '左'; c[i][j] = c[i][j - 1]; } else { c[i][j] = c[i - 1][j]; b[i][j] = '上'; } } } System.out.println(c[m-1][n-1]); } /** * 根据b数组中存储的结果路径,打印子串 */ public static void printLsc() { StringBuilder stringBuilder = new StringBuilder(); int i = b.length - 1; int j = b[i].length - 1; while (i > 0 && j > 0) { if (b[i][j] == '左') { j--; } else if (b[i][j] == '上') { i--; } else { stringBuilder.append(b[i][j]); i--; j--; } } System.out.println(stringBuilder.reverse().toString()); } }
相关文章推荐
- 算法学习之路:动态规划-最大公共子序列-java实现
- 算法学习之最大子序列算法(java实现)
- [算法学习]Java实现字符序列全组合
- 最大子序列算法的JAVA实现
- 【算法数据结构Java实现】时间复杂度为O(n)的最大和序列
- Java实现算法之最大公共子序列
- 最大子序列算法的JAVA实现
- 算法学习之路:分治策略-最大子数组-java实现
- java实现最大子序列问题——————性能最优的算法
- 学习笔记——c语言实现最大连续子序列之和的算法
- 8大内部排序算法学习笔记--(1)插入排序java实现
- 最大子数组和算法(Java实现)
- 算法java实现--分支限界法--最大团问题
- 一步步学习数据结构和算法之快速排序效率分析及java实现
- 一步步学习数据结构和算法之堆排序效率分析及java实现
- 三种算法求最大子段和问题——Java实现
- 感知机学习算法Java实现
- Java实现的计算最大下标距离算法示例
- 求所有最大公共子序列的算法实现
- HDU1003 Max Sum 最大子序列和的问题【四种算法分析+实现】