技术标签: 算法 Java算法 辛星 最长公共子串 动态规划 dp
上一篇介绍到最长公共子序列,这一篇就来介绍下最长公共子串,即最长公共子字符串。也就是Longest Common Substring,通常也被简称为LCS,比较尴尬的是和上一篇的简称是重名的。
要求最长公共子串,思路有很多,这里介绍两种,但是实现上是相同的,只是初始思路不同:
第一种,比较常规且自然的思路就是对于字符串a和b,构造一个二维数组arr,其中arr[i][j]表示第a[i]和b[j]是否相等,如果相等则填充为1,否则填充为0.
这样求最大子字符串就等价于求从坐上到右下的斜线里面最大有多少个1,不过这一种求法似乎并不太容易实现,因此可以考虑做成累加和的形式。即如果一个元素是1,且它的左上角的值也为1,那么就让它的值加上左上角的值。
这样只需要遍历最大值就可以找到最长公共子字符串在哪里了。
第二种,我们考虑已经找到了最大子字符串,它的最后一位是字符串a的第i个值和字符串b的第j个值,即a[i] == b[j],假设我们要在一个arr[i][j]中保存这个长度的话,那么arr[i-1][j-1]的值必然是这个值减去1,依次我们可以得到一个递归关系。
即如果a[i] == b[j]的话,则有arr[i][j] = arr[i -1 ][j -1] + 1。如果不等,则arr[i][j]的值为0.
既然已经有了思路,接下来就是写出来代码了,如下所示:
package com.mengzhidu.teach.algorithm.dp.demo.line;
/**
* 最长公共子串
* 子串相对于子序列,最大的区别是要求连续的
* 这里的arr数组保存的是以a[i]和b[j]为结尾的公共子字符串的长度
* 之所以存储这种情况,是因为计算简单
* 但是获取最大值的话还需要一次遍历
* 也可以把最后需要的结果直接用变量的方式存起来,都是ok的
*/
public class LcsDemo2 {
public static void main(String[] args) {
String a = "helloworldmyhero";
String b = "orlmyhero";
lcs(a, b);
}
private static void lcs(String a, String b) {
if (a == null || b == null) {
return;
}
char[] charA = a.toCharArray();
char[] charB = b.toCharArray();
int lengthA = charA.length;
int lengthB = charB.length;
int[][] arr = new int[lengthA + 1][lengthB + 1];
for (int i = 1; i <= lengthA; i++) {
for (int j = 1; j <= lengthB; j++) {
if (charA[i - 1] == charB[j - 1]) {
arr[i][j] = arr[i - 1][j - 1] + 1;
}
}
}
int maxLength = 0;
int end = 0;
for (int i = 0; i <= lengthA; i ++) {
for (int j = 0; j <= lengthB; j++) {
if (maxLength < arr[i][j]) {
end = i;
maxLength = arr[i][j];
}
}
}
System.out.println("最大长度为:" + maxLength);
System.out.println("字符串为:" + a.subSequence(end - maxLength, end));
}
}
这里我们选择了两种遍历的方式,这样代码写的比较简洁,不过多了一层运算。我们也可以直接把这些变量保存起来,这样就不用第二次的循环了。
不过由于这种方式比较简单,因此就留给读着朋友们了。
文章浏览阅读9.9k次,点赞2次,收藏9次。一、第一种方法首行增加,已测试可用。# coding=gbk程序中出现中文,运行的时候出现如下错误:SyntaxError: Non-UTF-8 code starting with 'xc1' in file C:...xxx.py on line 8, but no encoding declared; see http://python.org/dev/peps/pep-0263/ _syntaxerror: non-utf-8 code starting with '\xc8' in file c:\users\26743\desk
文章浏览阅读111次。这一题,测试了好几种情况都通过了,例如:())(;((()));)))(((;(())));但是提交只能通过10%,我现在陷入死角了,求各位大佬帮忙;我这一题的思路是,遍历一遍字符串,假如最后结果栈中只有")("那么就判断一次交换可以成功,其他情况都不成功import java.util.Scanner;import java.util.Stack;/*** @Author: Taoyongpan..._笔试代码找错
文章浏览阅读10w+次,点赞13次,收藏102次。http://blog.csdn.net/pipisorry/article/details/52209377pandas 最基本的时间序列类型就是以时间戳(TimeStamp)为 index 元素的 Series 类型。其它时间序列处理相关的包[P4J 0.6: Periodic light curve analysis tools based on Information Theory][p4_x must be a pandas object
文章浏览阅读2.5k次。本文目录结构问题Vue组件的生命周期答案总共分为8个阶段创建前/后,载⼊前/后,更新前/后,销毁前/后创建前/后: 在 beforeCreate 阶段, vue 实例的挂载元素 el 和数据对象 data 都为undefined ,还未初始化。在 created 阶段, vue 实例的数据对象 data 有了,el还 没有载⼊前/后:在 beforeMount 阶段, vue 实例的 $el 和 ..._vue渲染dom是在哪个环节
文章浏览阅读1.2k次。前两篇在服务器上把远程界面和虚拟机都安装好了后,现在进入第一小节,安装操作系统,这里要安装的是centos6.8。 1、下载安装系统。 进入CentOS官方网站 https://www.centos.org,找到要下载的系统下载,怎么下载,这个网上有很多资料,就不赘述了,我本地网很慢,依然在服务器上下载了wget http://archive.kernel.org/centos-vau..._ubuntu18.4对应centos那个版本
文章浏览阅读1.2w次,点赞10次,收藏46次。ARL灯塔是信息搜集的工具之一,一款基于Linux搭建的资源信息管理控制器,其作用就是搜集信息,可以快速侦察与目标关联的互联网资产,本次我们基于centos8.2进行搭建安装系统(目前暂不支持Windows)。前提:1.已经安装好docker //安装docker比较简单,不同系统安装命令略有差异,各位朋友自行百度安装即可2.已经安装好docker-compose安装docker-........._灯塔安装
文章浏览阅读263次。高一通用技术课堂《设计的一般过程》的优秀教案教学过程1. 引入新课多媒体投影展示几个新颖的设计,这些作品基于什么目的而设计的,它解决了什么问题?师:这些作品是怎么来的呢?生:设计出来的。师:我们要知道完成任何一件事情都有一个过程,须遵循一定的步骤,设计也不例外。通过前面的学习,我们已经知道,技术世界因设计而愈加精彩,设计是技术发展的关键。我们设计的最终目的是什么?就是为了解决人们的实际需要。那么同..._高一计算机技术与通用教案
文章浏览阅读172次。题目题目链接内容给两个字符串a,ba,ba,b ,和整数kkk 询问a,ba,ba,b的公共子串中长度大于等于kkk的个数分析对于一个长度为len(len>=k)len(len>=k)len(len>=k) 的公共子串,它对答案的贡献为len−k+1len-k+1len−k+1 ,我们构建后缀数组,将heightheightheight 数组排序,从大到小遍历hei..._并查集 poj 3415
文章浏览阅读2.5k次。在linux下编程的程序猿都知道shell脚本,就算你不怎么熟悉,也应该听过的吧!那在shell脚本中的死循环该怎么写呢?对于熟悉C语言的猿人们来说,最简单的死循环应该这样写:-------------------------------------------------------------------------while(1){//do something}---------------..._写一个死循环while(1)
文章浏览阅读1k次。毋庸置疑,每个人都有自己的名言警句,因为有目标、因为有理想,我们都在拼命努地奋斗着、拼搏着,希望你的名言可以让你距离成功更进一步,相信自己! 1. Success is never a destination, it is a journey.—— Statenig St. Marie 成功不是终点,而是旅程。—— 斯塔特尼格·圣·玛_brian tracy 名言
文章浏览阅读521次。利用python 编译工程,生产pyc文件pyc文件好处:是一种二进制机器码,并且隐藏了源文件代码,但是有和py文件一样的功能(可以理解为效果一样)所以可以将代码隐藏,便于商业价值,保护代码隐私还能和py文件一样可运行import compileallcompileall.compile_dir(r'/path')所以在一些情况下,需将源文件工程批量生成pyc文件来隐藏代码。上面代码即为 批量生成..._python 没有py文件调用pyc文件失败
文章浏览阅读111次。在众多人眼中,程序猿是最不会穿衣搭配的物种了,他们一年四季的标配就是格子衫加牛仔裤,冷的时候再加件冲锋衣。每到春夏,码农的大花格子衬衫就会在互联网公司的格子间遍地开花,如同冲锋衣是秋冬标配一样,格子衬衫就是程序员的夏季制服,一堆程序员在一起都不是连连看。人靠衣装,佛靠金装”这句话很多人都听过,但是放在心上的未必有几个,对于不善于穿衣打扮的程...序...员...来说,更是如此。根据聚能...