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

来源:互联网 发布:阿里云怎么建设网站 编辑:程序博客网 时间:2024/06/15 00:02

和最大公共子序列类似,都是采用的是动态规划,不同的是,连续的串不需要判断不相等情况下的求最大,只需要判断相等即可,然后更新最大长度和每个序列的起始位置。

package stringTest;/** * 最大公共子串 * @author duola * */public class lcs2 {    public static String lcs2(String s1,String s2) {        if(s1==""||s2==""||s1.length()<=0||s2.length()<=0) return "";        int [][]c=new int[s1.length()+1][s2.length()+1];        int max=0,m=0,n=0;        for(int i=s1.length()-1;i>=0;i--){            for(int j=s2.length()-1;j>=0;j--){                if(s1.charAt(i)==s2.charAt(j)){                    c[i][j]=c[i+1][j+1]+1;                }                if(c[i][j]>max){                    max=c[i][j];                    m=i;                    n=j;                }            }        }        System.out.println("最大子串的长度是:"+max);          StringBuilder sb=new StringBuilder();        for(int i=m,j=n;i<s1.length()&&j<s2.length();i++,j++){            if(c[i][j]>0){                sb.append(s1.charAt(i));            }        }        return sb.toString();    }    public static void main(String [] args) {        String s1="abcdfrgrgr";        String s2="sbcdfjksjdksgrgjk";        System.out.print("最大的公共子串是"+lcs2(s1,s2));    }}

需要注意的是输出的是最后一个最大公共子串,因为最大公共子串可能有多个。

0 0