[程序员代码面试指南]递归和动态规划-最长公共子串问题(DP,LCST)
问题描述
如题。
例:输入两个字符串 str1="1AB234",str2="1234EF" ,应输出最长公共子串"234".
解题思路
状态表示
dp[i][j]表示把str1[I]和str2[j]作为公共子串的最后一个字符,最长公共子串的长度。
最终,找到dp数组中的最大值及其位置,则可计算并获得最长子串。
状态转移方程
dp[i][j]=dp[i-1][j-1]+1 ,(str[i]==str[j])
dp[i][j]=0,(str[I]!=str[j])
对空间进行压缩,空间复杂度由O(M*N)压缩至O(1)
- 由于dp[i][j]只依赖于dp[i-1][j-1],所以可以将空间压缩至O(1).
- 斜线起始点由右上角开始,向左向下。一条斜线中,从左上,至右下遍历。
- 代码中,len即为dp[i][j],表示状态。
- 此外,维护最大子串长度及对应的结尾位置两个变量即可。
代码(空间复杂度O(1)版)
public class Main {
public static void main(String[] args) {
String s1="1AB2345CD";
String s2="12345EF";
String subStr=LCST(s1,s2);
System.out.println(subStr);
}
public static String LCST(String s1,String s2) {
if(s1==null||s2==null||s1.length()==0||s2.length()==0) {
return "";
}
int longestLen=0;
int longestPos=-1;
int rows=s1.length();
int cols=s2.length();
int rBeg=0;
int cBeg=cols-1;
while(rBeg<rows) {
//初始化斜线起点位置
int i=rBeg;
int j=cBeg;
int len=0;//
//一条斜线
while(j<cols&&i<rows) {
if(s1.charAt(i)!=s2.charAt(j)) {
len=0;
}
else {
len+=1;
}
if(len>longestLen) {//
longestLen=len;
longestPos=j;
}
++j;
++i;
}
//移动斜线起点位置
if(cBeg>0) {
--cBeg;
}
else {
++rBeg;
}
}
return s2.substring(longestPos+1-longestLen,longestPos+1);
}
}
[程序员代码面试指南]递归和动态规划-最长公共子串问题(DP,LCST)的更多相关文章
- [程序员代码面试指南]递归和动态规划-换钱的方法数(DP,完全背包)
题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的方法数. 解题思路 完全背包 和"求换钱的 ...
- [程序员代码面试指南]递归和动态规划-数字字符串转换为字母组合的种数(DP)
题意 给一个字符串,只由数字组成,若是'1'-'26',则认为可以转换为'a'-'z'对应的字母,问有多少种转换方法. 题解 状态转移很好想,注意dp多开一位,dp[0]为dp[2]的计算做准备.dp ...
- [程序员代码面试指南]递归和动态规划-排成一条线的纸牌博弈问题(DP)
题目 给定一个整型数组arr,代表数值不同的纸牌排成一条线.玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明.请返回最后获 ...
- [程序员代码面试指南]递归和动态规划-最小编辑代价(DP)
问题描述 输入 原字符串StrOrg,目标字符串StrTarget,插入.删除.替换的编辑代价ic,dc,rc.输出将原字符串编辑成目标字符串的最小代价. 解题思路 状态表示 dp[i][j]表示把s ...
- [程序员代码面试指南]递归和动态规划-换钱的最少货币数(DP,完全背包)
题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的最少货币数. 解题思路 dp[i][j]表示只用第0 ...
- [程序员代码面试指南]递归和动态规划-机器人达到指定位置方法数(一维DP待做)(DP)
题目描述 一行N个位置1到N,机器人初始位置M,机器人可以往左/右走(只能在位置范围内),规定机器人必须走K步,最终到位置P.输入这四个参数,输出机器人可以走的方法数. 解题思路 DP 方法一:时间复 ...
- 程序员代码面试指南 IT名企算法与数据结构题目最优解
原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...
- 程序员代码面试指南:IT名企算法与数据结构题目最优解
第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...
- [程序员代码面试指南]最长递增子序列(二分,DP)
题目 例:arr=[2,1,5,3,6,4,8,9,7] ,最长递增子序列为1,3,4,8,9 题解 step1:找最长连续子序列长度 dp[]存以arr[i]结尾的情况下,arr[0..i]中的最长 ...
随机推荐
- Kruscal算法求图的最小生成树
Kruscal算法求图的最小生成树 概述 和Prim算法求图的最小生成树一样,Kruscal算法求最小生成树也用到了贪心的思想,只不过前者是贪心地选择点,后者是贪心地选择边.而且在算法的实现中,我 ...
- sourcetree关于注册的问题
当前只有Win的版本,Mac自行百度(笑) 很多人用git命令行不熟练,那么可以尝试使用sourcetree进行操作. 然鹅~~sourcetree又一个比较严肃的问题就是,很多人不会跳过注册或者操作 ...
- unity探索者之微信分享所有流程,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7560575.html 很久没有写新博客了,前段时间有些忙,这几天趟了几个微信分享的 ...
- cdh6.2.1搭建安装
1.为CM安装mysql驱动 4台服务器 将mysql-connector-java-5.1.27-bin.jar拷贝到/usr/share/java路径下,并重命名 mv mysql-connect ...
- 记录一下navicat的快捷键
1.ctrl+q 打开查询窗口2.ctrl+/ 注释sql语句3.ctrl+shift +/ 解除注释4.ctrl+r 运行查询窗口的s ...
- 9.hbase相关进程作用
1.协调服务组件Zookeeper Zookeeper的作用如下: 1. 保证任何时候,集群中只有一个HMaster: 2. 存储所有的HRegion的寻址入口: 3. 实时监控HRegionServ ...
- 关于ACID,BASE和CAP定理的探究
前言 当我看到"根据CAP理论,由于分布式系统必须保证分区容错性,所以只能选择AP原则或者CP原则"这种结论时,我感到很疑惑: 什么是分区容错性? 为什么分布式系统必须保证分区容错 ...
- springboot的常用注解
1. @SpringBootApplication2. @Repository3. @Service4. @RestController5. @Controller6. @Component7. @R ...
- 风变编程-Python基础语法
第0关-千寻的名字 目录 1.范例1 2.范例2 1.知识点总结 2.范例 1)单引号和双引号 2)三引号 3)转义字符 1.知识点总结 1)变量 2)变量名 3)变量的命名规范 4)等于与赋值的区别 ...
- java安全编码指南之:基础篇
目录 简介 java平台本身的安全性 安全第一,不要写聪明的代码 在代码设计之初就考虑安全性 避免重复的代码 限制权限 构建可信边界 封装 写文档 简介 作为一个程序员,只是写出好用的代码是不够的,我 ...