1、问题: 求两字符序列的最长公共字符子序列LCS

2、求解:动态规划法

动态规划的思路就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位置。如下表:

改进矩阵,如果左上角非零且本身值是1,则在左上角值基础上加1,如下表:

参考代码如下:

package com.pub;import java.util.ArrayList;
import java.util.List;public class LCS {public static List<String> getLCSstring(char[] str1, char[] str2) {int i, j;int len1, len2;len1 = str1.length;len2 = str2.length;int maxLen = len1 > len2 ? len1 : len2;int[] max = new int[maxLen];int[] maxIndex = new int[maxLen];int[] c = new int[maxLen];List<String> list = new ArrayList<>();//生成矩阵for (i = 0; i < len2; i++) {for (j = len1 - 1; j >= 0; j--) {if (str2[i] == str1[j]) {if ((i == 0) || (j == 0))c[j] = 1;elsec[j] = c[j - 1] + 1;} else {c[j] = 0;}if (c[j] > max[0]) {   //如果是大于那暂时只有一个是最长的,而且要把后面的清0;max[0] = c[j];maxIndex[0] = j;for (int k = 1; k < maxLen; k++) {max[k] = 0;maxIndex[k] = 0;}} else if (c[j] == max[0]) {   //有多个是相同长度的子串for (int k = 1; k < maxLen; k++) {if (max[k] == 0) {max[k] = c[j];maxIndex[k] = j;break;  //在后面加一个就要退出循环了}}}}}for (j = 0; j < maxLen; j++) {if (max[j] > 0) {StringBuffer sb = new StringBuffer();for (i = maxIndex[j] - max[j] + 1; i <= maxIndex[j]; i++) {sb.append(str1[i]);}String lcs = sb.toString();list.add(lcs);}}return list;}public static void main(String[] args) {String str1 = new String("adbba12345");String str2 = new String("adbbf1234sa");List<String> list = getLCSstring(str1.toCharArray(), str2.toCharArray());for (int i = 0; i < list.size(); i++) {System.out.println("第" + (i + 1) + "个公共子串:" + list.get(i));}str1 = new String("adbab1234");str2 = new String("adbbf123s4a");list = getLCSstring(str1.toCharArray(), str2.toCharArray());for (int i = 0; i < list.size(); i++) {System.out.println("第" + (i + 1) + "个公共子串:" + list.get(i));}}
}

Java实现算法导论中最长公共子序列(LCS)动态规划法相关推荐

  1. python实现求解最长公共子序列LCS问题

    在实现论文<Automatically Generating Models for Botnet Detection>论文的算法中,用到了一个The longest commom subs ...

  2. 算法导论-----最长公共子序列LCS(动态规划)

    目录 一.概念梳理 二.最长公共子序列解决方案 方案1:蛮力搜索策略 方案2:动态规划策略 三.C代码实现 实现1 实现2(空间优化) 一.概念梳理   1. 子序列(subsequence): 一个 ...

  3. 动态规划算法解最长公共子序列LCS问题

    动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...

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

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

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

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

  6. 算法之最长公共子序列(LCS)问题

    算法课上老师留的作业,最长公共子序列LCS(Longest Common Subsequence)问题,首先看到这个问题感觉有点复杂,和最长公共子串不同,公共子序列并不要求元素相邻,看起来只有穷举才能 ...

  7. 程序员编程艺术第十一章:最长公共子序列(LCS)问题

    程序员编程艺术第十一章:最长公共子序列(LCS)问题 0.前言 程序员编程艺术系列重新开始创作了(前十章,请参考程序员编程艺术第一~十章集锦与总结).回顾之前的前十章,有些代码是值得商榷的,因当时的代 ...

  8. 动态规划之最长公共子序列(LCS)

    最长公共子序列(LCS,Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最 ...

  9. 动态规划表格法解决最长公共子序列(LCS)问题

    3.5 最长公共子序列(LCS) 前言:图片是博主自己画的,转载请注明出处哦 3.5.1 问题描述 最长公共子序列(Longest Common Subseuence,LCS)问题:给定两个字符串,求 ...

最新文章

  1. IDEA那些既好用又好玩的30多款宝贝插件,你知道多少?
  2. Tomcat unable to start within 45 seconds.
  3. python编辑公式_分分钟甩Word几条街,Python编辑公式竟可以如此简单
  4. 面试题 08.09. 括号
  5. 读取SAE J1939协议数据流
  6. MAC 浏览器长截屏 滚动截屏
  7. Express访问静态资源(express.static)
  8. java token guid_生成一个唯一token
  9. IOS菜鸟初学第八篇:接入京东联盟sdk,可打开任意京东的链接
  10. vue之解决跨域问题
  11. “人在囧途”今年少有的国产好电影
  12. idea 回退merge_idea Git版本回退
  13. 2020-11-20
  14. 009 二维随机变量分布 min max 习题
  15. 税费计算机,友商税费计算器
  16. 用户上传用户头像至服务器
  17. 应届计算机科学与技术简历,计算机科学与技术应届生简历范文
  18. 2.什么是JAVA内存模型?
  19. 离散数学图论旅行规划问题_旅游路径规划问题.pdf
  20. 电池供电电源自动切换的装置

热门文章

  1. louvian算法 缺点 优化_机器学习中的优化算法(1)-优化算法重要性,SGD,Momentum(附Python示例)...
  2. win7_iis报500.19和500.21错误问题解决
  3. .net core 程序退出事件
  4. Java并发编程之ThreadLocal源码分析
  5. GIT 源码管理-简介
  6. 如何用图表控件实现点击图例图标隐藏图表序列
  7. pthread多线程编程的学习小结
  8. jae的mongo数据库管理工具(原创)
  9. [转]学校的统一订书80%该烧掉——IT推荐书单
  10. 8953n的user获取权限以及remount