最长公共子串

来源:互联网 发布:人脉关系网软件 编辑:程序博客网 时间:2024/06/16 11:17

1、最长公共子串与最长公共子序列的区别?
最长公共子序列在原序列中不要求连续,而最长公共子串要求在原序列中是连续的。

分析:求两个子串x(x[0],x[1],……,x[n-1]),y(y[0],y[1],……,y[m-1])的最长公共子串,令dp[i][j]表示以x[i-1],y[j-1]结尾的最长公共子串的长度。则可以得出转态转移方程:
这里写图片描述

import java.util.Scanner;//s1,s2最长公共子串public class LCS2{    static int dp[][];//dp[i][j]:以s1[i-1],s2[j-1]结尾的最长公共子串的长度    public static void main(String[] args)    {        Scanner in=new Scanner(System.in);        while(in.hasNext())        {            String s1=in.next();            String s2=in.next();            dp=new int[s1.length()+1][s2.length()+1];            String resut=lcs(s1, s2);            System.out.println(resut);        }    }    static public String lcs(String s1,String s2)    {        int n=s1.length();        int m=s2.length();        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            {                if(s1.charAt(i-1)==s2.charAt(j-1))                {                    dp[i][j]=dp[i-1][j-1]+1;                }else                {                    dp[i][j]=0;                }            }        }        int max=0;        int end=-1;        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            {                if(max<dp[i][j])                {                    max=dp[i][j];                    end=i;                }            }        }        if(max>0){            return s1.substring(end-max,end);        }        return "";    }}
1 0
原创粉丝点击