题目

最长公共子串

给出两个字符串,找到最长公共子串,并返回其长度。

样例

给出A=“ABCD”,B=“CBCE”,返回 2

注意

子串的字符应该连续的出现在原字符串中,这与子序列有所不同。

解题

注意:

子序列:这个序列不是在原字符串中连续的位置,而是有间隔的,如:ABCDE  和AMBMCMDMEM 最长公共子序列是ADCDE

子串:子串一定在原来字符串中连续存在的。如:ABCDEF 和SSSABCDOOOO最长公共子串是ABCD

参考链接,讲解很详细

根据子串定义,暴力破解

public class Solution {
/**
* @param A, B: Two string.
* @return: the length of the longest common substring.
*/
public int longestCommonSubstring(String A, String B) {
// write your code here
if(A == null || B == null ||A.length() ==0 || B.length() ==0)
return 0;
int lenA = A.length();
int lenB = B.length();
int longest = -1; for(int i=0 ; i <lenA ;i++){
for(int j=0; j <lenB ;j++){
int m = i;
int n = j;
int sublongest = 0;
while(m<lenA && n < lenB){
char ch1 = A.charAt(m);
char ch2 = B.charAt(n);
if(ch1 == ch2){
m++;
n++;
sublongest += 1;
}else{
break;
}
}
longest = Math.max(longest,sublongest);
}
}
return longest; }
}

Java Code

时间复杂度O(N2M2)

该解法的思路就如前所说,以字符串中的每个字符作为子串的端点,判定以此为开始的子串的相同字符最长能达到的长度。其实从表层上想,这个算法的复杂度应该只有O(n2)因为该算法把每个字符都成对相互比较一遍,但关键问题在于比较两个字符串的效率并非是O(1),这也导致了实际的时间复杂度应该是满足O(n2)和O(n3)。

上面博客中给了第一种动态规划的解法

定义数组C[lenA+1][lenB+1] C[i][j] 表示字符串A 以A[i-1] 结束 B以B[j-1] 最大相同子串的长度

当A[i-1] ==B[j-1] 的时候 C[i][j] = C[i-1][j-1] + 1 理解了子串的定义就很显然的,”连续字符串“

当A[i-1] !=B[j-1] 的时候  C[i][j] = 0

数组中的最大值就是答案了

public class Solution {
/**
* @param A, B: Two string.
* @return: the length of the longest common substring.
*/
public int longestCommonSubstring(String A, String B) {
// write your code here
// String A = "cpoe.com code";
// String B = "ccht.com code";
if(A == null || B == null ||A.length() ==0 || B.length() ==0)
return 0;
int lenA = A.length();
int lenB = B.length();
int [][] C = new int[lenA + 1][lenB + 1];
int longest = -1;
for(int i=1;i<= lenA;i++){
for(int j= 1;j<= lenB;j++){
char ch1 = A.charAt(i-1);
char ch2 = B.charAt(j-1);
if( ch1 == ch2){
C[i][j] = C[i-1][j-1] + 1;
}else{
C[i][j] = 0;
}
longest = Math.max(C[i][j],longest);
}
} return longest; }
}

Java Code

在求最长公共子序列的题目中我考虑过利用数组进行求解,但是好的解法都没有直接用到我定义的那么简单的数组

对于这个题目,字符串数组表示为:相同字符是 1

你一定会发现:子串一定在对角线上,连续对角线上1最多的那个就是最长的子串,子串的起始位置就是左上的第一个1,结束位置就是右下的最后一个一,暴力方法就是对每一个点开始的对角线1的个数,最大值就是答案,这个方法其实和上面的暴力方法一个意思的。

public class Solution {
/**
* @param A, B: Two string.
* @return: the length of the longest common substring.
*/
public int longestCommonSubstring(String A, String B) {
// write your code here
if(A == null || B == null ||A.length() ==0 || B.length() ==0)
return 0;
int lenA = A.length();
int lenB = B.length();
int [][] C = new int[lenA ][lenB ];
int longest = -1;
for(int i=0;i<lenA;i++){
for(int j= 0;j< lenB;j++){
char ch1 = A.charAt(i);
char ch2 = B.charAt(j);
if( ch1 == ch2){
C[i][j] = 1;
}else{
C[i][j] = 0;
} }
}
for(int i =0;i< lenA;i++){
for(int j=0;j<lenB;j++){
int m = i;
int n = j;
int sublongest = 0;
while(m<lenA && n <lenB){
if(C[m][n] ==1){
sublongest +=1;
m++;
n++;
}else{
break;
}
}
longest = Math.max(longest,sublongest);
}
} return longest; }
}

Java Code

上面的动态规划解法是在求出数组的同时求对角线上1的个数,上面的分开计算更容易理解,更容易想到动态规划的解法。

上面博客还要其他方法,待更新。。。

lintcode :最长公共子串的更多相关文章

  1. lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)

    Longest Common Subsequence最长公共子序列: 每个dp位置表示的是第i.j个字母的最长公共子序列 class Solution { public: int findLength ...

  2. lintcode-79-最长公共子串

    79-最长公共子串 给出两个字符串,找到最长公共子串,并返回其长度. 注意事项 子串的字符应该连续的出现在原字符串中,这与子序列有所不同. 样例 给出A="ABCD",B=&quo ...

  3. [Data Structure] LCSs——最长公共子序列和最长公共子串

    1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...

  4. HDU 1503 带回朔路径的最长公共子串

    http://acm.hdu.edu.cn/showproblem.php?pid=1503 这道题又WA了好几次 在裸最长公共子串基础上加了回溯功能,就是给三种状态各做一个 不同的标记.dp[n][ ...

  5. 最长公共子序列PK最长公共子串

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. (1)递归方法求最长公共子序列的长度 1) ...

  6. 动态规划(一)——最长公共子序列和最长公共子串

    注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...

  7. 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774

    Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...

  8. 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message

    Language: Default Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 21 ...

  9. 最长公共子串 NYOJ 36

    http://acm.nyist.net/JudgeOnline/problem.php?pid=36 最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 ...

随机推荐

  1. Linux 文件与目录

    文件描述符 在内核中,所有打开的文件都使用文件描述符(一个非负整数)标记.文件描述符的变化范围是0~OPEN_MAX – 1.早期的unix系统中,每个进程最多可以同时打开20个文件,就是说文件描述符 ...

  2. Linux rsync 同步

    rsync 是一个快速增量文件传输工具,它可以用于在同一主机备份内部的备分,我们还可以把它作为不同主机网络备份工具之用.本文主要讲述的是如何自架rsync服务器,以实现文件传输.备份和镜像.相对tar ...

  3. ASP.NET Web API 2 对 CORS 的支持

    CORS概念 跨域资源共享 (CORS) 是一种万维网联合会 (W3C) 规范(通常被认为是 HTML5 的一部分),它可让 JavaScript 克服由浏览器施加的同域策略安全限制. 所谓同域策略, ...

  4. R语言实战读书笔记1—语言介绍

    第一章 语言介绍 1.1 典型的数据分析步骤 1.2 获取帮助 help.start() help("which") help.search("which") ...

  5. Matlab实现均匀量化

    Matlab实现均匀量化 首先读入一个音频文件的前200个点,如果音频通道大于1则只取一个通道,滤掉其余的 得到音频文件的最大值和最小值,最大值和最小值的差除以2的4次方即16得到量化电平的端点间隔. ...

  6. Quartz.NET Windows

    Quartz.NET Windows 服务示例 想必大家在项目中处理简单的后台持续任务或者定时触发任务的时候均使用 Thread 或者 Task 来完成,但是项目中的这种需求一旦多了的话就得将任务调度 ...

  7. linux下的clock skew detected

    今天在虚拟机上用GCC编译一个程序的时候,出现了下面的错误: make: warning: Clock skew detected. Your build may be incomplete 试了ma ...

  8. Node.js 学习(一) 安装配置

    Windowv 上安装Node.js Windows 安装包(.msi) : 32 位安装包下载地址 : http://nodejs.org/dist/v0.10.26/node-v0.10.26-x ...

  9. java 24点算法实现

    最近闲来无事,突然怀念起小时候和堂兄表姐们经常玩24点游戏,于是就琢磨着是不是开发一个安卓手机版本.然后上网上一搜,发现已经被别人给开发烂了啊.不过这只能说明这个小游戏要想赚广告费很难了,但是拿来锻炼 ...

  10. hdu 1028 Ignatius and the Princess III

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1028 题目大意:3=1+1+1=1+2=3 :4=4=1+1+1+1=1+2+1=1+3:所以3有3种 ...