问题描述

如题。

例:输入两个字符串 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)的更多相关文章

  1. [程序员代码面试指南]递归和动态规划-换钱的方法数(DP,完全背包)

    题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的方法数. 解题思路 完全背包 和"求换钱的 ...

  2. [程序员代码面试指南]递归和动态规划-数字字符串转换为字母组合的种数(DP)

    题意 给一个字符串,只由数字组成,若是'1'-'26',则认为可以转换为'a'-'z'对应的字母,问有多少种转换方法. 题解 状态转移很好想,注意dp多开一位,dp[0]为dp[2]的计算做准备.dp ...

  3. [程序员代码面试指南]递归和动态规划-排成一条线的纸牌博弈问题(DP)

    题目 给定一个整型数组arr,代表数值不同的纸牌排成一条线.玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明.请返回最后获 ...

  4. [程序员代码面试指南]递归和动态规划-最小编辑代价(DP)

    问题描述 输入 原字符串StrOrg,目标字符串StrTarget,插入.删除.替换的编辑代价ic,dc,rc.输出将原字符串编辑成目标字符串的最小代价. 解题思路 状态表示 dp[i][j]表示把s ...

  5. [程序员代码面试指南]递归和动态规划-换钱的最少货币数(DP,完全背包)

    题目描述 给定arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的最少货币数. 解题思路 dp[i][j]表示只用第0 ...

  6. [程序员代码面试指南]递归和动态规划-机器人达到指定位置方法数(一维DP待做)(DP)

    题目描述 一行N个位置1到N,机器人初始位置M,机器人可以往左/右走(只能在位置范围内),规定机器人必须走K步,最终到位置P.输入这四个参数,输出机器人可以走的方法数. 解题思路 DP 方法一:时间复 ...

  7. 程序员代码面试指南 IT名企算法与数据结构题目最优解

    原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...

  8. 程序员代码面试指南:IT名企算法与数据结构题目最优解

      第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...

  9. [程序员代码面试指南]最长递增子序列(二分,DP)

    题目 例:arr=[2,1,5,3,6,4,8,9,7] ,最长递增子序列为1,3,4,8,9 题解 step1:找最长连续子序列长度 dp[]存以arr[i]结尾的情况下,arr[0..i]中的最长 ...

随机推荐

  1. MSDN 无法显示的问题 2010-03-21 21:08

    MSDN 无法显示的问题regsvr32 "C:\Program Files\Common Files\Microsoft Shared\Help\hxds.dll" .试图运行项 ...

  2. 关于数据库新建用户提示“用户、组或角色‘’XXX‘’在当前数据库中已已存在”的解决办法

    一般在还原数据库后,给这个数据库添加一个登录名时出现. 例如数据库备份文件中已经包含了用户abc,现在还原了数据库,然后发现现有数据库中没有abc这个用户,想要新建一个abc用户,作为该数据库的own ...

  3. Python Matplotlib绘图基础

    Matplotlib绘图基础 1.Figure和Subplot import numpy as np import matplotlib.pyplot as plt #创建一个Figure fig = ...

  4. 开发APP遇到的问题

    1.代码尽量复用 2.调用高德地图,直辖市等,省字段一定有值,市可能为空(pro:'北京市',city:[]) 3.支付密码不用组件 <template> <view> < ...

  5. JQ选择器总结

    jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个 ...

  6. WordCloud教程(上)

    先贴代码: import wordcloud,jieba with open('datas/1.txt') as rt:#,encoding='utf-8' comment_text=rt.read( ...

  7. openvswitch 流表测试 ovs-appctl

    [root@ostack170 ~]# ovs-appctl ofproto/trace br-mirror in_port=,dl_vlan=,dl_src=:ea:cb:5d:e4:ee,dl_d ...

  8. Java数据结构——图的基本理论及简单实现

    1. 图的定义图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的:其中,点通常被成为"顶点(vertex)",而点与点之间的连线则被成为"边 ...

  9. 给Django的Admin添加自定义Action 并移除需要选择对象的限制

    不得不说,Django的Admin真的给开发带来很多便利,这不,我又来折腾了,这次是添加自定义的action 这个自定义的Action可以看看官方文档的介绍,很详细,不再赘述. https://doc ...

  10. JavaScript基础语法资料

    JavaScript基础第01天 1 - 编程语言 1.1 编程 编程: 就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 计算机程序: 就是计算机所执行的一系列的 ...