两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。其实这又是一个序贯决策问题,可以用动态规划来求解。我们采用一个二维矩阵来记录中间的结果。这个二维矩阵怎么构造呢?"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"ba"或"ab")

   b  a  b

c  0  0  0

a  0  1  0

b  1  0  1

a  0  1  0
我们看矩阵的斜对角线最长的那个就能找出最长公共子串。
不过在二维矩阵上找最长的由1组成的斜对角线也是件麻烦费时的事,下面改进:当要在矩阵是填1时让它等于其左上角元素加1。
   b  a  b

c  0  0  0

a  0  1  0

b  1  0  2

a  0  2  0

这样矩阵中的最大元素就是 最长公共子串的长度。

import java.util.Scanner;public class LCS {public static void main(String[] args) {Scanner in=new Scanner(System.in);String s1=in.nextLine();String s2=in.nextLine();System.out.println(iQueryMaxCommString(s1,s2));}public static String iQueryMaxCommString(String stringA, String stringB){/* 在这里实现功能,将结果填入输入数组中*/ //String x = "wer";//String y = "werasdfaswer";String x=stringA;String y=stringB;// 设置字符串长度int substringLength1 = x.length();int substringLength2 = y.length(); // 具体大小可自行设置// 构造二维数组记录子问题x[i]和y[i]的LCS的长度int[][] opt = new int[substringLength1 + 1][substringLength2 + 1];// 动态规划计算所有子问题。也可从前到后。for (int i =0; i <substringLength1; i++) {for (int j = 0; j <substringLength2 ; j++) {if (x.charAt(i) == y.charAt(j))if(i==0||j==0){opt[i][j]=1;}else{opt[i][j] = opt[i -1][j - 1] + 1;//左上角加1}                                 }}/*System.out.println("substring1:" + x);System.out.println("substring2:" + y);System.out.println("LCS:");//输出状态矩阵for (int i =0; i <substringLength1; i++) {for (int j = 0; j <substringLength2 ; j++) {              System.out.print(opt[i][j]+" ");                             }System.out.println();}*///找到状态举矩阵的最大值,和坐标indexi,indexj int max=opt[0][0];int indexi=0,indexj=0;for (int i =0; i <substringLength1; i++) {for (int j = 0; j <substringLength2 ; j++) {              if(opt[i][j] >max){max=opt[i][j];     indexi=i;indexj=j;}}           }//System.out.println(max);if(max!=0){       //取短的字符串输出String rs=null;int indexofmax=0,shortlen;if(substringLength1>substringLength2){shortlen=substringLength2;rs=y;indexofmax=indexj;}else{shortlen=substringLength1;rs=x;indexofmax=indexi;}StringBuffer sb=new StringBuffer();for(int i=0;i<max;i++){sb.append(rs.charAt(indexofmax-max+1+i)); }return sb.toString();}return null;}
}

动态规划--最长公共子串相关推荐

  1. 动态规划—最长公共子串

    1.求最长公共子串的长度 问题描述:有两个字符串str和str2,求出两个字符串中最长公共子串长度.str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最 ...

  2. 动态规划——最长公共子串,没有比这更通俗易懂的了

    前言 动态规划是大厂的热门考点,其中最长公共子串与最长公共子序列这两道题出现得尤其频繁,这两道题其实有挺多变种,很适合考察侯选人对动态规划的掌握情况,今天我们就先来看看如何求解最长公共子串,图文并茂, ...

  3. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  4. 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用

    2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...

  5. 动态规划 dp03 最长公共子串问题 c代码

    题目: 若序列Z是序列X的子序列,又是Y的子序列,则称Z是序列X与Y的公共子序列.例如序列"bcba"是序列"abcbdab"与"bdcaba&quo ...

  6. 动态规划之最长公共子串

    一 问题引入 在生物学中,经常需要比较两个不同生物的DNA,一个DNA串由由一串称为碱基的的分子组成,碱基有鸟嘌呤,腺嘌呤,胞嘧啶,胸腺嘧啶四中,我们用英文字母的首字母表示四种碱基,那么DNA就是在有 ...

  7. 两个字符串的最长公共子序列长度_【面试】动态规划-之最长公共子序列、最长公共子串问题...

    先来说明下什么是最长公共子序列,什么是是最长公共子串,举一个实际例子,myblogs与belong,最长公共子序列为blog(myblogs, belong),最长公共子串为lo(myblogs, b ...

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

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

  9. 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)

    动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...

最新文章

  1. 字节一实习生求助:晚上九点半在公司打游戏,被领导发现后开除,将来找工作会背调出来吗?...
  2. echarts与TmodJS的冲突 -- 模块化加载器之间的冲突
  3. 利用PyMySQL模块操作数据库
  4. php留言簿代码,php自治简单留言板代码
  5. nginx配置反向代理示例
  6. 搭建基础架构-Page
  7. mysql gtid 备份恢复_MYSQL数据库备份恢复
  8. 【计算机网络】比较TCP与UDP
  9. leetcode题解227-基本计算器 II
  10. Win11系统Microsoft Store应用商店加载空白,不能下载软件.
  11. 微信小程序demo(新闻类)
  12. 基于java的健康管理平台设计与实现(含源文件)
  13. 英伟达发布3款RTX 20系列游戏显卡,性能提升6倍让游戏更像电影
  14. Pigeon中的流量限制
  15. Notes 20180311 : String第三讲_深入了解String
  16. 认识Base64,看这篇足够了
  17. COLA的扩展性使用和源码研究
  18. 计算机二级Python学习笔记(三):天天向上的力量
  19. 来自灵魂深处的拷问:人为什么要活着?
  20. 软件修复硬盘物理坏道究竟靠不靠谱?效哥告诉你标准答案

热门文章

  1. MFC全局函数开局——AfxGetApp解剖
  2. QPainter中坐标系变换问题
  3. Win10安装Vue-cli
  4. 跨链(5)“蚂蚁区块链”之跨链系统框架
  5. 风力等级表(供参考)
  6. 【django】创建django项目工程
  7. 经典面试题-Linux Kernel面试题
  8. 05-密码学基础-RSA的介绍
  9. 用Go语言建立一个简单的区块链part7:网络
  10. 3、MySQL二进制日志(Binary Log)详解