最长公共子序列(LCS)和最长公共连续子串

来源:互联网 发布:淘宝商业模式分析 编辑:程序博客网 时间:2024/05/16 06:35
import java.util.ArrayList;import java.util.List;/** * Created by gaoji on 2017/4/12. */public class LeetcodeSolution {    public static void main(String[] args) {        System.out.println(longestSub("bdcaba","abcbdab"));        longestConsectiveString("abcgooglecbaleABVC","cbagoogleABVC");    }    public static int longestSub(String s1,String s2){        int m = s1.length();        int n = s2.length();        int[][] dp = new int[m+1][n+1];        for (int i = 0; i <= m; i++) {            dp[i][0] = 0;        }        for (int i = 1; i < n+1 ; i++) {            dp[0][i] = 0;        }        for (int i = 1; i < m+1; i++) {            for (int j = 1; j <= n; j++) {                if(s1.charAt(i-1)==s2.charAt(j-1)){                    dp[i][j] = dp[i-1][j-1]+1;                }else{                    dp[i][j] = Math.max(dp[i][j-1],dp[i-1][j]);                }            }        }        return dp[m][n];    }//输出两个字符串的最长连续公共子串,如果有多个,都输出。    public static void longestConsectiveString(String s1,String s2){         int m = s1.length();        int n= s2.length();        List<Integer> list = new ArrayList<Integer>();        int[][] dp = new int[m][n];        int length = 0;        int index = -1;        for (int i = 0; i < m; i++) {            for (int j = 0; j < n; j++) {                if(i==0||j==0){                    if(s1.charAt(i)==s2.charAt(j)){                        dp[i][j]=1;                    }else{                        dp[i][j]=0;                    }                }else if(s1.charAt(i)==s2.charAt(j)){                    dp[i][j]= dp[i-1][j-1]+1;                    if(length<dp[i][j]){                        list.clear();                        length = dp[i][j];                        list.add(i);                    }else if(length == dp[i][j]){                        list.add(i);                    }                }            }        }        for (int i :list) {            System.out.println(s1.substring(i- length + 1, i + 1));        }    }}

LCS状态转移方程:

       - 如果s1[m] == s2[n],则dp[m,n] = dp[m - 1, n -1] + 1;
       - 如果s1[m] != s2[n],则dp[m,n] = max{dp[m,n - 1],dp[m - 1, n]}

最长连续公共子串的状态转移方程:

s1[i]==s2[j],dp[i][j] = dp[i-1][j-1]+1;

s1[i]!=s2[j].dp[i][j] = 0;

0 0
原创粉丝点击