1. 程式人生 > >最長公共子字符串

最長公共子字符串

[0 size end 動態規劃 class rar substr static logs

給定兩個字符串,找到最長的公共子字符串,比如String1=abc12dfe string2=abdec12dfab 所以公共子字符串為c12df。

思路:動態規劃,以每個字符為尾字符。

代碼:

public class Main {
    //生成dp數組
    public static int[][] getdp(char[] c1, char[] c2) {
        
        int len1 = c1.length;
        int len2 = c2.length;
        
        int[][] dp = new int[len1][len2];
        
        
//第一行填充 for(int j=0; j<len2; j++) { if(c1[0] == c2[j]) { dp[0][j] = 1; } } //第一列填充 for(int i=0; i<len1; i++) { if(c1[i] == c2[0]) { dp[i][0] = 1; } } for(int i=1; i<len1; i++) {
for(int j=1; j<len2; j++) { if(c1[i] == c2[j]) { dp[i][j] = dp[i-1][j-1]+1; } } } return dp; } public static String lcs(String s1, String s2) { if(s1==null || s1.length()==0 || s2==null || s2.length()==0) {
return null; } char[] c1 = s1.toCharArray(); char[] c2 = s2.toCharArray(); int[][] dp = getdp(c1, c2); int row = dp.length; int col = dp[0].length; int end = 0; int max =0; for(int i=0; i<row; i++) { for(int j=0; j<col; j++) { if(dp[i][j]>=max) { max = dp[i][j]; end = i; } } } return s1.substring(end-max+1,end+1); } public static void main(String[] args) { String s1 = "A1234B"; String s2 = "CD1234"; System.out.println(lcs(s1, s2)); } }

最長公共子字符串