lintcode :最长公共子串
题目
最长公共子串
给出两个字符串,找到最长公共子串,并返回其长度。
给出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 :最长公共子串的更多相关文章
- lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)
Longest Common Subsequence最长公共子序列: 每个dp位置表示的是第i.j个字母的最长公共子序列 class Solution { public: int findLength ...
- lintcode-79-最长公共子串
79-最长公共子串 给出两个字符串,找到最长公共子串,并返回其长度. 注意事项 子串的字符应该连续的出现在原字符串中,这与子序列有所不同. 样例 给出A="ABCD",B=&quo ...
- [Data Structure] LCSs——最长公共子序列和最长公共子串
1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...
- HDU 1503 带回朔路径的最长公共子串
http://acm.hdu.edu.cn/showproblem.php?pid=1503 这道题又WA了好几次 在裸最长公共子串基础上加了回溯功能,就是给三种状态各做一个 不同的标记.dp[n][ ...
- 最长公共子序列PK最长公共子串
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. (1)递归方法求最长公共子序列的长度 1) ...
- 动态规划(一)——最长公共子序列和最长公共子串
注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ...
- 最长公共子串 NYOJ 36
http://acm.nyist.net/JudgeOnline/problem.php?pid=36 最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 ...
随机推荐
- MVC Razor模板引擎输出HTML或者生产HTML文件
以前做CMS的时候都会根据模板来生成输出HTML或者生成HTML文件. 常用的引擎有VTemplate.NVelocity等等,这个我就布做介绍了. 这里我想说的是.当mvc出现Razor模板引擎的时 ...
- A taste of urllib3
import urllib3 import certifi http = urllib3.PoolManager( cert_reqs='CERT_REQUIRED', # Force certifi ...
- 微软职位内部推荐-SDEII for Windows Phone Apps
微软近期Open的职位: Job title: Software Design Engineer II Location: China, Beijing Division: Operations Sy ...
- Travis-CI的进一步使用
今天主要对.travis.yml文件和makefile进行进一步的了解: 1.在.travis.yml文件中添加了给linux系统中安装了cppunit库的语句,使能够持续集成写过的单元测试的代码.主 ...
- Tomcat性能参数设置
Tomcat性能参数设置 Tomcat性能参数设置 博客分类: Java LinuxTomcat网络应用多线程Socket 默认参数不适合生产环境使用,因此需要修改一些参数 1.修改启动时内存参数.并 ...
- 【转】eclipse技巧1
俗话说的好啊,“工于利启事,必先善其器”,如果说你的编程功底是一个枪法的话,那么强大的eclipse就是android战士们最好的武器. 这里,我们来总结eclipse的使用技巧,从而使我们的编程达到 ...
- Jquery.ajax(……)
ajax 详细解释:http://www.cnblogs.com/mybest/archive/2011/12/13/2285730.html: 问题描述:页面发送ajax请求,服务器端返回代码总是进 ...
- 【Python】vim7.4 配置python2.6支持Gundo
问题描述: vim7.4 配置python2.6支持Gundo 参考资料: (1) http://sjl.bitbucket.org/gundo.vim/ ...
- Leetcode#106 Construct Binary Tree from Inorder and Postorder Traversal
原题地址 二叉树基本操作 [ ]O[ ] [ ][ ]O 代码: TreeNode *restore(vector<i ...
- Tomcat漏洞说明与安全加固
Tomcat是Apache软件基金会的一个免费的.开放源码的WEB应用服务器,可以运行在Linux和Windows等多个平台上,由于其性能稳定.扩展性好.免费等特点深受广大用户的喜爱.目前,互联网上绝 ...