算法系列——最长公共子串

来源:互联网 发布:淘宝回收十字绣靠谱吗 编辑:程序博客网 时间:2024/06/06 13:04

题目描述

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

注意事项

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

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

解题思路

应用动态规划,状态方程为 dp[i][j]表示

dp[i][j]表示Xi和Yi的最大Substring的长度,比如对于X和Y

   X = <y, e, d, f>   Y = <y, e, k, f>

dp[0][0]=1;dp[1][1]=2;dp[d][k]=0;dp[f][f]=1;
动态转移方程为:
如果xi == yj, 则 dp[i][j] = dp[i-1][j-1]+1
如果xi ! = yj, 那么dp[i][j] = 0
最后求Longest Common Substring的长度等于

   max{  dp[i][j],  1<=i<=n, 1<=j<=m}

程序实现

public class Solution {    /**     * @param A, B: Two string.     * @return: the length of the longest common substring.     */    public int longestCommonSubstring(String A, String B) {       if(A==null||A.length()==0||B==null||B.length()==0)            return 0;        int m=A.length();        int n=B.length();        int[][] dp=new int[m][n];        int maxLen=0;        //初始化第一行        for(int i=0;i<n;i++){            if(A.charAt(0)==B.charAt(i)){                dp[0][i]=1;                maxLen=1;            }            else                dp[0][i]=0;        }        //初始化第一列        for(int j=0;j<m;j++){            if(A.charAt(j)==B.charAt(0)){                dp[j][0]=1;                maxLen=1;            }            else                dp[j][0]=0;        }        for(int i=1;i<m;i++)            for(int j=1;j<n;j++){                if(A.charAt(i)==B.charAt(j))                    dp[i][j]=dp[i-1][j-1]+1;                else                    dp[i][j]=0;                maxLen=Math.max(maxLen,dp[i][j]);            }        return maxLen;    }}
原创粉丝点击