动态规划--最长公共子串
找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。其实这又是一个序贯决策问题,可以用动态规划来求解。我们采用一个二维矩阵来记录中间的结果。这个二维矩阵怎么构造呢?"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.求最长公共子串的长度 问题描述:有两个字符串str和str2,求出两个字符串中最长公共子串长度.str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最 ...
- 动态规划——最长公共子串,没有比这更通俗易懂的了
前言 动态规划是大厂的热门考点,其中最长公共子串与最长公共子序列这两道题出现得尤其频繁,这两道题其实有挺多变种,很适合考察侯选人对动态规划的掌握情况,今天我们就先来看看如何求解最长公共子串,图文并茂, ...
- 【动态规划】最长公共子序列与最长公共子串
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用
2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...
- 动态规划 dp03 最长公共子串问题 c代码
题目: 若序列Z是序列X的子序列,又是Y的子序列,则称Z是序列X与Y的公共子序列.例如序列"bcba"是序列"abcbdab"与"bdcaba&quo ...
- 动态规划之最长公共子串
一 问题引入 在生物学中,经常需要比较两个不同生物的DNA,一个DNA串由由一串称为碱基的的分子组成,碱基有鸟嘌呤,腺嘌呤,胞嘧啶,胸腺嘧啶四中,我们用英文字母的首字母表示四种碱基,那么DNA就是在有 ...
- 两个字符串的最长公共子序列长度_【面试】动态规划-之最长公共子序列、最长公共子串问题...
先来说明下什么是最长公共子序列,什么是是最长公共子串,举一个实际例子,myblogs与belong,最长公共子序列为blog(myblogs, belong),最长公共子串为lo(myblogs, b ...
- 动态规划算法之:最长公共子序列 最长公共子串(LCS)
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...
- 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)
动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...
最新文章
- 字节一实习生求助:晚上九点半在公司打游戏,被领导发现后开除,将来找工作会背调出来吗?...
- echarts与TmodJS的冲突 -- 模块化加载器之间的冲突
- 利用PyMySQL模块操作数据库
- php留言簿代码,php自治简单留言板代码
- nginx配置反向代理示例
- 搭建基础架构-Page
- mysql gtid 备份恢复_MYSQL数据库备份恢复
- 【计算机网络】比较TCP与UDP
- leetcode题解227-基本计算器 II
- Win11系统Microsoft Store应用商店加载空白,不能下载软件.
- 微信小程序demo(新闻类)
- 基于java的健康管理平台设计与实现(含源文件)
- 英伟达发布3款RTX 20系列游戏显卡,性能提升6倍让游戏更像电影
- Pigeon中的流量限制
- Notes 20180311 : String第三讲_深入了解String
- 认识Base64,看这篇足够了
- COLA的扩展性使用和源码研究
- 计算机二级Python学习笔记(三):天天向上的力量
- 来自灵魂深处的拷问:人为什么要活着?
- 软件修复硬盘物理坏道究竟靠不靠谱?效哥告诉你标准答案