java最长公共子串_最长公共子串(java)
关于动态规划:
动态规划最重要的是找到可递推的子问题,然后列出递推公式,最后搜索填表即可。
表空间大小一般是$O(N^2)$级别。但一般来说,由于递推只与前一行有关,所以可优化至O(N)。
给出两个长度分别为n1, n2的字符串S1, S2, 关于他们的最长公共子串,DP方程如下:
L[i,j] = ( S1[i] == s2[j] ? L[i-1,j-1]+1 : 0 );
其中L[i,j]表示S1, S2中以第i 和第j 个字符结尾的公共子串的长度。
我们把n1 * n2的表空间遍历一遍就可得出最长公共子串。代码如下:
public String DPlengthOfLongestCommonSubstring(String s1, String s2){
if (s1 == null || s2 == null || s1.length() == 0 || s2.length() == 0){
return "";
}
int start = 0;
int maxLen = 0;
int [][] table = new int[s1.length()][s2.length()];
for (int i = 0; i < s1.length(); i++) {
for (int j = 0; j < s2.length(); j++) {
if (i == 0 || j == 0){
if (s1.charAt(i) == s2.charAt(j)){
table[i][j] = 1;
}
if (table[i][j] > maxLen){
maxLen = table[i][j];
start = i;
}
}else {
if (s1.charAt(i) == s2.charAt(j)){
table[i][j] = table[i-1][j-1] + 1;
}
if (table[i][j] > maxLen){
maxLen = table[i][j];
start = i + 1 - maxLen;
}
}
}
}
return s1.substring(start, start + maxLen);
}
由于只要填表,而后一行值只与前一行有关,因此空间可以省到O(N)。还是DP惯用的一前一后防覆盖法。
/**
* 只用O(N)额外空间
* @param s1
* @param s2
* @return
*/
public String DPlengthOfLongestCommonSubstring2(String s1, String s2){
if (s1 == null || s2 == null || s1.length() == 0 || s2.length() == 0){
return "";
}
int start = 0;
int maxLen = 0;
int[] table = new int[s2.length()];
for (int i = 0; i < s1.length(); i++) {
for (int j = s2.length()-1; j > - 1; j--) {
if (i == 0 || j == 0){
if (s1.charAt(i) == s2.charAt(j)){
table[j] = 1;
}else {
table[j] = 0;
}
if (table[j] > maxLen){
maxLen = table[j];
start = i;
}
}else {
if (s1.charAt(i) == s2.charAt(j)){
table[j] = table[j-1] + 1;
}else {
table[j] = 0;
}
if (table[j] > maxLen){
maxLen = table[j];
start = i + 1 - maxLen;
}
}
}
}
return s1.substring(start, start + maxLen);
}
java最长公共子串_最长公共子串(java)相关推荐
- hwd分别是长宽高_衣柜长宽高标准尺寸一般是多少 衣柜怎么保养
一般的话,我们在市面上购买衣柜的时候会考虑尺寸的问题,因为家里房子的大小不相同,所以选择的尺寸也不一样,如果买的太大了家里就放不下,所以,大家一定要看一下衣柜长宽高的标准尺寸一般是多少,大家可以根据标 ...
- java五子棋代码详解_代码详解:Java和Valohai的深度学习之旅
全文共10735字,预计学习时长22分钟或更长 有一款生命周期管理工具(也称云服务)叫做Valohai,它有着友好的用户界面和简洁的布局设计. 许多有关Valohai的案例和文档都是基于Python和 ...
- java runtime异常如何解决_成都汇智动力-Java中常见的RunTime异常及异常详解
java.lang.ArithmeticException算术条件异常.譬如:整数除零等.java.lang.ArrayIndexOutOfBoundsException数组索引越界异常.当对数组的索 ...
- java注释还能运行_老师,你确定Java注释不会被执行吗?
之前在博客上分享过一篇文章,涉及到 Java 中的注释,就信誓旦旦地写了一句话:"注释是不会被执行的!"结果,有小伙伴留言说,"老师,你确定吗?" 我这个人一直 ...
- java中将txt转换为数组_关于android:在Java中将列表转换为数组
本问题已经有最佳答案,请猛点这里访问. 在Java中,如何将EDCOX1的0度转换为EDCOX1×1? 检查以下代码: ArrayList tiendas; List tiendasList; tie ...
- java中execution的作用_一文初步了解Java虚拟机
大家都知道,Java中JVM的重要性,学习了JVM你对Java的运行机制.编译过程和如何对Java程序进行调优相信都会有一个很好的认知. 什么是JVM? JVM(Java Virtual Machin ...
- java语言用什么编程_使用什么编程语言开发Java?
The Java Language is a language specification – you don't write a language in a language, it's a spe ...
- 无忧考吧2017二级java_无忧考吧二级JAVA超级模拟软件下载_无忧考吧二级JAVA超级模拟软件官方下载-太平洋下载中心...
无忧考吧二级JAVA超级模拟软件是一款可以帮助用户朋友来学习计算机二级java语言考试的软件,使用这款二级java模拟考试软件可以帮助用户快速的掌握学习内容和操作逻辑,让你顺利的通过二级java考试. ...
- java 序列化概念和作用_结合代码详细解读Java序列化与反序列化概念理解
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
- java代码删除文件夹_删除文件夹的java类
/** * @author www.nwu.edu.cn MiniRice * @author darkrice@gmail.com * @version 1.2 * */ http://www ...
最新文章
- GPU加速:宽深度推理
- Pycharm 和 vscode 多光标、折叠代码和代码格式化快捷键
- 大数据教程(10.6)自定义inputFormat(小文件合并)
- 64 大小_32位和64位Windows系统差别在哪里
- 前端学习(1966)vue之电商管理系统电商系统之获取参数列表
- linux中demo当前目录,Linux pwd命令:显示当前路径
- 从苏宁电器到卡巴斯基第03篇:我的本科时光(下)
- window版本下载安装kafka和ZooKeeper并调试
- 智能卡卡发卡流程(收藏1)
- kubernetes配置kubeconfig访问集群
- flink 出现反压场景, 异常场景造成Exceeded checkpoint tolerable failure threshold.
- 面试经验|计算机网络面试相关知识
- SQL手工注入漏洞测试(Oracle数据库)
- 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java自来水收费管理系统7yd5p
- 副驾驶的意义_副驾驶在飞行中的作用与地位
- 数据库视图创建及应用
- 解决steam下载的植物大战僵尸无法打开,报错Fetal error!问题
- C# 添加OLE到PPT幻灯片
- i.MX6ULL终结者官方SDK简介
- 红米3 android 版本,红米3四款手机有什么不同?红米3系列手机各版本区别详解