最长公共子序列

/*** 最长公共子序列* 参考链接:http://blog.csdn.net/biangren/article/details/8038605* Created by 18710 on 2017/8/24.*/
public class LongestCommonSubsequence {public static void main(String[] args) {char[] x = {'A', 'B', 'C', 'B', 'D', 'A', 'B'};char[] y = { 'B', 'D', 'C', 'A', 'B', 'A'};int[][] direction = getLongestCommonSubsequence(x, y);getLongestCommonSubsequence(direction, x, x.length - 1, y.length - 1);}/*** 动态规划:状态为目前的最长子序列长度* lcs[i][j] = 0; if i == 0 || j == 0* lcs[i][j] = lcs[i-1][j-1] + 1; if x[i]=y[j]* lcs[i][j] = lcs[i][j-1]; if x[i]!=y[j] && lcs[i][j-1] > lcs[i-1][j]* lcs[i][j] = lcs[i-1][j]; if x[i]!=y[j] && lcs[i][j-1] < lcs[i-1][j]* 具体流程参考 img文件夹下的 LongestCommonSubsequence.img* @param x 第一个字符串* @param y 第二个字符串* @return 最长子序列的遍历方向*/public static int[][] getLongestCommonSubsequence(char[] x, char[] y) {if (x == null || y == null || x.length == 0 || y.length == 0) {return null;}// 长度为原来的长度加1,因为第一行和第一列的值都是空,这样动态规划的时候省去判断第一行然后i-0小于0的情况int[][] lcs = new int[x.length + 1][y.length + 1]; // 保存最长子序列的长度int[][] direction = new int[x.length + 1][y.length + 1]; // 保存搜索方向for (int i = 0; i < x.length; i++) {for (int j = 0; j < y.length; j++) {if (x[i] == y[j]) {lcs[i + 1][j + 1] = lcs[i][j] + 1; // 相等公共子序列长度加1direction[i + 1][j + 1] = 1; // 1表示左上角对角线移动} else if (lcs[i][j + 1] >= lcs[i + 1][j]) { /** 注意条件是大于等于*/lcs[i + 1][j + 1] = lcs[i][j + 1]; // 上边的元素值较大direction[i + 1][j + 1] = 0; // 0表示上移动} else {lcs[i + 1][j + 1] = lcs[i + 1][j];  // 左边的元素值较大direction[i + 1][j + 1] = -1; // -1表示左移动}}}return direction;}/***根据最长子序列的方向打印子序列* @param direction 方向数组* @param x 第一个或者第二个字符串* @param i 横坐标* @param j 纵坐标*/public static void getLongestCommonSubsequence (int[][] direction, char[] x, int i, int j) {if (i < 0 || j < 0) { // 第一行为空return ;}if (direction[i + 1][j + 1] == 1) { // 1表示左上角getLongestCommonSubsequence(direction, x, i - 1, j - 1);System.out.print(x[i] + " ");} else if (direction[i + 1][j + 1] == 0) { // 0表示上移动getLongestCommonSubsequence(direction, x, i - 1, j);} else if (direction[i + 1][j + 1] == -1){ // -1表示左移动getLongestCommonSubsequence(direction, x, i, j - 1);}}}

最长公共子串

动态规划:求得最长子串长度和最后一个相同字符的下标即可

/*** 最长公共子串* 动态规划:求的最长子串长度和最后一个相同字符的下标即可* 参考链接:http://blog.csdn.net/hackbuteer1/article/details/6686931** Created by 18710 on 2017/8/24.*/
public class LongestCommonSubstring {public static void main(String[] args) {char[] x = {'A', 'B', 'C', 'D',};char[] y = { 'C', 'A', 'B', 'E'};getLongestCommonSubstring(x, y);}/*** 动态规划:状态为目前的最长子串长度* lcs[i][j] = 0; if i == 0 || j == 0 || x[i]!=y[j]* lcs[i][j] = lcs[i-1][j-1] + 1; if x[i]=y[j]* @param x 第一个字符串* @param y 第二个字符串* @return*/public static void getLongestCommonSubstring(char[] x, char[] y) {if (x == null || y == null || x.length == 0 || y.length == 0) {return ;}int max = 0; // 最长公共子串的长度int lastX = 0; // 第一个字符串 最长公共子串最后一个字符的数组下标// 长度为原来的长度加1,因为第一行和第一列的值都是空,// 这样动态规划的时候省去判断第一行然后i-0小于0的情况int[][] lcs = new int[x.length + 1][y.length + 1]; // 保存最长子序列的长度for (int i = 0; i < x.length; i++) {for (int j = 0; j < y.length; j++) {if (x[i] == y[j]) {lcs[i + 1][j + 1] = lcs[i][j] + 1; // 相等公共子序列长度加1} else {lcs[i + 1][j + 1] = 0;  // 左边的元素值较大}if (lcs[i + 1][j + 1] > max) { // 更新最长子串的长度和两个子串对应的下标max = lcs[i + 1][j + 1];lastX = i;}}}System.out.println("最长子串长度为:" + max + ",下标为:" + lastX);StringBuffer sb = new StringBuffer(); // 保存最长公共子串while (max-- > 0) {sb.append(x[lastX--]);}System.out.println(sb.reverse().toString()); // 逆序打印}}

数据结构 - 字符串 - 最长公共子序列 + 最长公共子字符串 - 动态规划相关推荐

  1. 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...

  2. 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...

    最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和 文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathi ...

  3. 动态规划算法之:最长公共子序列 最长公共子串(LCS)

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...

  4. 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...

  5. 剑指offer48-最长不含重复字符的子字符串(双指针经典)

    问题描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 ...

  6. 求最长不含重复字符的子字符串——C++

    声明:本文原题主要来自力扣,记录此博客主要是为自己学习总结,不做任何商业等活动! 一.原题描述 剑指 Offer 48. 最长不含重复字符的子字符串 请从字符串中找出一个最长的不包含重复字符的子字符串 ...

  7. 最长不含重复字符的子字符串(C++)

    最长不含重复字符的子字符串 描述   请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 数据范围:s.length≤40000 示例1 输入: "abcabcb ...

  8. 字符串左侧补0_(48)C++面试之最长不含重复字符的子字符串(动态规划)

    // 面试题48:最长不含重复字符的子字符串 // 题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子 // 字符串的长度.假设字符串中只包含从'a'到'z'的字符. #inclu ...

  9. 【LeetCode】剑指 Offer 48. 最长不含重复字符的子字符串

    [LeetCode]剑指 Offer 48. 最长不含重复字符的子字符串 文章目录 [LeetCode]剑指 Offer 48. 最长不含重复字符的子字符串 package offer;import ...

最新文章

  1. php 复制文件夹并压缩到最小_PHP压缩文件夹的方法
  2. 【ArcGIS Pro微课1000例】0001:Win7系统ArcGIS Pro2.5安装权威教程(附软件安装包下载)
  3. Linux入门笔记——less
  4. jq 比较两个时间是否在同一天_jq: 属性-class
  5. win c语言创建线程,初学者 CWinThread 线程类
  6. Stackoverflow 年度报告 2020:开发者最喜爱的数据库是什么?
  7. 使用ASP.NET Core开始使用gRPC客户端和服务器
  8. mes系统与Oracle对接,Oracle ERP系统与MES系统的接口分析及实现
  9. java redis3.0_Java + Redis(第三章)
  10. 在中国从事什么职业最赚钱_中国最好的十大职业2(转)
  11. 让代码更美:10大编程字体
  12. 射频day7:微带线;带状线
  13. 锂电池电量百分比计算_手机电池容量的百分比显示跟电池的电量“格子”的比例计算...
  14. Lagrange 四平方定理
  15. 什么是计算机系统延迟,什么是低延迟(Low Latency)?
  16. 2020华为杯E题——基于灰色预测的大雾能见度预测模型(附代码)
  17. C/C++语言问题——某年某月的天数是多少?
  18. Flash进度条ProgressBar
  19. 票务公司网上订票系统
  20. Mac安装以及使用SVN提交代码教程

热门文章

  1. 04-树7 二叉搜索树的操作集(c语言实现)
  2. __stdcall和__cdecl的区别
  3. 当心在Lib中定义非const全局变量
  4. 操作系统 :银行家算法的实现(C++)
  5. MyBatis(一)MyBatis介绍和配置详解
  6. 深入理解Cache工作原理
  7. 设计模式:各个模式间的对比
  8. JAVA线程间协作:Condition
  9. 飞哥:程序员完全没时间提升自己该怎么办?
  10. 如何使用开源SFU构建RTC云服务