动态规划系列【4】最长公共子串

对于两个字符串,请设计一个时间复杂度为O(m*n)的算法(这里的m和n为两串的长度),求出两串的最长公共子串的长度。这里的最长公共子串的定义为两个序列U1,U2,..Un和V1,V2,...Vn,其中Ui
  + 1 == Ui+1,Vi + 1 == Vi+1,同时Ui == Vi。
给定两个字符串A和B,同时给定两串的长度n和m。
测试样例:
"1AB2345CD",9,"12345EF",7
返回:4

题意:求最长公共子串。子串是连续的。子序列是不连续的。

public class LongestSubstring {
    public int findLongest(String A, int n, String B, int m) {
        // write code here
        //dp[i][j]表示以A[i]和B[j]作为公共子串最后一个字符的情况下,公共子串的最大长度
        int[][] dp=new int[n][m];
        dp[0][0]=A.charAt(0)==B.charAt(0)?1:0;
        for(int i=1;i<n;i++){
            if(A.charAt(i)==B.charAt(0))
                dp[i][0]=1;
            else
                dp[i][0]=0;
        }
        for(int j=1;j<m;j++){
            if(A.charAt(0)==B.charAt(j)){
                dp[0][j]=1;
            }else{
                dp[0][j]=0;
            }
        }
       
        for(int i=1;i<n;i++)
            for(int j=1;j<m;j++)
                if(A.charAt(i)==B.charAt(j)){
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{
                    dp[i][j]=0;
                }
         //最后求一下dp矩阵中的最大值
        int max=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++){
                if(dp[i][j]>max)
                    max=dp[i][j];
            }
        return max;
    }
}

O(mn)   O(mn).....还可以压缩到空间复杂度O(1)

时间: 2024-10-25 17:44:17

动态规划系列【4】最长公共子串的相关文章

java 动态规划算法求解最长公共子串

最近在项目中碰到了这样的一个问题,要比较JS和CSS是否做了修改,先是想着借助第三方工具发现没找到,后面转念一想,这个问题不就是对两个文件的第一行求最大的公共子串嘛,既然是要求公共子串的最大长度,由此想到了动态规划算法. 代码是从网上C++改写过来的,感谢那位C++的兄弟,代码如下: package dp; /** * 用动态规划算法求解 最长公共子串 * @author * */ public class LCSSuffix { private static String getLCSLeng

动态规划之最长公共子串

一 问题引入 在生物学中,经常需要比较两个不同生物的DNA,一个DNA串由由一串称为碱基的的分子组成,碱基有鸟嘌呤,腺嘌呤,胞嘧啶,胸腺嘧啶四中,我们用英文字母的首字母表示四种碱基,那么DNA就是在有限集{A,C,G,T}上的一个字符串.例如某种生物的DNA序列为:S1=ACCGGTCGAGTGCGCGGAAGCCGGCCGAA,S2=GTCGTTCGGAATGCCGTTGCTCTGTAAA,我们比较两个DNA串的原因就是希望确定他们的相似度,作为衡量两个物种相似度的标准.如果一个串是另外一个串

动态规划算法之:最长公共子序列 & 最长公共子串(LCS)

1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题,可以用动态规划来求解.我们采用一个二维矩阵来记录中间的结果.这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"ba"或"ab") b a b c 0 0 0 a 0 1

动态规划——最长公共子串

引入: 最长公共子序列常用于解决字符串的相似度问题. 最长公共子序列(Longest Common Subsequence,LCS)与最长公共字串(Longest Common Substring):子串是串的一个连续的部分,子序列则是从不改变序列顺序,而从序列中去掉任意多个元素而获得的新的序列:也就是说,子串中字符的位置一定是连续的,而子序列不一定连续. a  not the 之一(得到的未必就是唯一的那个最长公共子串,只有长度是唯一的) --其余字符串问题,待续 解决方案: 1.穷举法(Br

算法作业6 动态规划 - 最长公共子串问题

问题描述:Given 2 sequences, X = x1,...,xm and Y = y1,...,yn, find a common subsequence whose length is maximum. Subsequence need not be consecutive, but must be in order. 程序思路: 使用递归的思路可以解决这个问题.设输入的两个子串为X[0…m - 1]和Y[0…n - 1],L(X[0…m - 1], Y[0…n - 1])为X和Y的

《算法导论》读书笔记之动态规划—最长公共子序列 &amp; 最长公共子串(LCS)

From:http://my.oschina.net/leejun2005/blog/117167 1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题,可以用动态规划来求解.我们采用一个二维矩阵来记录中间的结果.这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是

动态规划--最长公共子串

最长公共子串也是一个动态规划的问题,先求出子问题的解,然后才能求出最优解. 首先我们来看设X = <x1, x2, ..., xm>, Y= <y1, y2, ..., yn>,设C[i][j]为串 Xi 和 Yj 的最长公共子串长度,则 C[i][j]  =  C[i-1][j-1] +1,  Xi == Yj C[i][j]  =  0,  Xi != Yj 申请一个m*n的数组,同时计算出该数组对应位置的数值,找出最大值,则为X 和 Y最长公共子串. 代码如下: 1 // L

动态规划 &amp; 最长公共子串算法(LCS)

求最长公共子串可以先求最长公共子串的长度,并且记录那些公共子串字符的长度以及字符,然后通过回溯可以找到所有的公共子串. 下面是求最长公共子串长度的动态规划方法. 1:决策,我们在最后一步需要做的决策是,是否要将A[n],B[m]加入公共子串序列中. 2:由 1 可知,若以DP[i][j]表示A[1..i] 与 B[1..j]的最长公共子串的长度,那么可以得到 (1) 若A[i] == B[j]  (即作出决策,将A[i],B[i]都加入公共子串) DP[i][j] = DP[i - 1][j -

求两个字符串最长公共子串(动态规划)

code如下: //Longest common sequence, dynamic programming method void FindLCS(char *str1, char *str2) { if(str1 == NULL || str2 == NULL) return; int length1 = strlen(str1)+1; int length2 = strlen(str2)+1; int **csLength,**direction;//two arrays to recor