给两个字符串,求两个字符串的最长子串

(例如:“abc”“xyz”的最长子串为空字符串,“abcde”和“bcde”的最长子串为“bcde”)

解题思路:

  1. 把两个字符串分成一个行列的二维矩阵
  2. 比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0。
  3. 通过查找出值为1的最长对角线就能找到最长公共子串。



    从图中我们可以看到,等于1的那个对角线就是我们要求的最长公共子串,同时我们还可以再优化一下:

    刚才我们说“比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0。” ,那么我们并不需要一直等于1,即:两个值相等时(a[i]b[j]),我们判断对角线前一个值是否相等(a[i-1]b[j-1]), 如果相等,那么我们只需要加上前一个的值即可。

我们可以通过一个二维数组实现:

int[][] arr = new int [a.length()][b.length()];
if (a.substring(i,i+1).equals(b.substring(j,j+1))){
arr[i][j] = 1+ arr[i-1][j-1] ;
}

完整代码为:

public class Lcs {

    public static String lCs(String a,String b){
int[][] arr = new int [a.length()][b.length()];
int leng = 0;
int index = 0; for (int i=0;i<a.length();i++){
for (int j=0;j<b.length();j++){
if (a.substring(i,i+1).equals(b.substring(j,j+1))){
if (i>0 && j>0){
arr[i][j] = 1+ arr[i-1][j-1] ;
}else{
arr[i][j] = 1;
}
}else {
arr[i][j] = 0;
}
if (arr[i][j]>leng){ leng=arr[i][j];
index = i ;
}
}
}
return a.substring(index-leng+1,index+1);
} public static void main(String[] args) {
System.out.println(Lcs.lCs("abcdefghij","asdabchij"));
}
}

[post url="https://github.com/CoderXiaohui/LeetCode/blob/master/src/String/Lcs.java" title="GitHub" intro="GitHub" cover="https://github.com/fluidicon.png" /]

参考链接

最长公共子串算法(Longest Common Substring)的更多相关文章

  1. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  2. 求最长公共子串 Longest Common Subsequence

    最长公共子串 // Longest Common Subsequence 子串有别于子序列, 子串是连续的, 而子序列可以不连续 /*--------------------------------- ...

  3. C#LeetCode刷题之#14-最长公共前缀​​​​​​​(Longest Common Prefix)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3921 访问. 编写一个函数来查找字符串数组中的最长公共前缀. 如 ...

  4. 动态规划之最长公共子序列LCS(Longest Common Subsequence)

    一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...

  5. LeetCode 14. 最长公共前缀(Longest Common Prefix)

    题目描述 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow ...

  6. 动态规划 ---- 最长公共子序列(Longest Common Subsequence, LCS)

    分析: 完整代码: // 最长公共子序列 #include <stdio.h> #include <algorithm> using namespace std; ; char ...

  7. DP:LCS(最长公共子串、最长公共子序列)

    1. 两者区别 约定:在本文中用 LCStr 表示最长公共子串(Longest Common Substring),LCSeq 表示最长公共子序列(Longest Common Subsequence ...

  8. 最长公共子串(LCS:Longest Common Substring)

    最长公共子串(LCS:Longest Common Substring)是一个非常经典的面试题目,本人在乐视二面中被面试官问过,惨败在该题目中. 什么是最长公共子串 最长公共子串问题的基本表述为:给定 ...

  9. 利用后缀数组(suffix array)求最长公共子串(longest common substring)

    摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...

随机推荐

  1. c++中的GetModuleFileName函数的用法以及作用

    参考: 1. http://blog.sina.com.cn/s/blog_b078a1cb0101fw48.html 2. https://www.cnblogs.com/Satu/p/820393 ...

  2. 怀疑安装MySQL之后,导致OrCAD Capture、Allegro就打不开

    记得在异常出现之前,只安装了MySQL,之后OrCAD Capture.Allegro就打不开了. Capture.exe - 系统错误 allegro.exe - 系统错误 我尝试在Cadence的 ...

  3. JavaFX FileChooser文件选择器、DirectoryChooser目录选择器

    参考:https://www.yiibai.com/javafx/javafx_filechooser.html 参考:https://blog.csdn.net/dorma_bin/article/ ...

  4. 正式班D5

    2020.10.10星期六 正式班D5 一.上节课复习 1.硬盘分类 ​ 1.机械磁盘 ​ io时间=平均寻道时间+平均延迟时间 ​ buffer:写缓冲区 ​ cache:都缓存 ​ 2.固态硬盘 ...

  5. 8-kubernetes-安全

    kubernetes安全框架 访问K8S集群的资源需要过三关:认证.鉴权.准入控制,任意一个不通过都会失败 普通用户若要安全访问集群API server,往往需要证书.token或者用户名+密码,po ...

  6. JSX 详解

    一 jsx 的本质是什么? jsx是语法糖,需要被编译成js才能运行. jsx 看似是html 结构,实质是js结构的语法糖,在代码编译阶段被编译成js结构.所以jsx的本质可描述为看似html结构的 ...

  7. 宜宾1178.9873(薇)xiaojie:宜宾哪里有xiaomei

    宜宾哪里有小姐服务大保健[微信:1178.9873倩儿小妹[宜宾叫小姐服务√o服务微信:1178.9873倩儿小妹[宜宾叫小姐服务][十微信:1178.9873倩儿小妹][宜宾叫小姐包夜服务][十微信 ...

  8. win32获取进程树,以及命令行参数

    1.先上代码 package main import ( "bytes" "errors" "flag" "fmt" & ...

  9. pytest文档55-plugins插件开发

    前言 前面一篇已经学会了使用hook函数改变pytest运行的结果,代码写在conftest.py文件,实际上就是本地的插件了. 当有一天你公司的小伙伴觉得你写的还不错,或者更多的小伙伴想要你这个功能 ...

  10. 【原创】xenomai内核解析--实时内存管理--xnheap

    目录 一. xenomai内存池管理 1.xnheap 2. xnpagemap 3. xnbucket 4. xnheap初始化 5. 内存块分配 5.1 小内存分配流程(<= 2*PAGE_ ...