最长公共子序列LCS

来源:互联网 发布:杭州行知中学 编辑:程序博客网 时间:2024/05/20 01:09

最长公共子序列LCS,java版本

举个栗子: "abcd" 和 "padcbd" 的最长公共子序列为 acd或者abd,长度为3


状态转移方程:

dp[i][j] = dp[i-1][j-1] + 1 ,if x[i] == y[j]         = max{dp[i-1][j], dp[i][j-1]},if x[i] != y[j]

dp[i][j]表示字符串X以i为结尾,字符串Y已j为结尾的最长公共子序列的长度


参考代码:

// 递归版本private static int LCS(String input1, String input2, int i, int j) {if (i == 0 && j == 0) {return input1.charAt(i) == input2.charAt(j) ? 1 : 0;}if (i == 0) {if (input1.charAt(i) == input2.charAt(j))return 1;elsereturn LCS(input1, input2, i, j - 1);}if (j == 0) {if (input1.charAt(i) == input2.charAt(j))return 1;elsereturn LCS(input1, input2, i - 1, j);}if (input1.charAt(i) == input2.charAt(j)) {return LCS(input1, input2, i - 1, j - 1) + 1;} else {return Math.max(LCS(input1, input2, i, j - 1),LCS(input1, input2, i - 1, j));}}// 非递归版本private static int LCS2(String input1, String input2) {if(input1==null || input2 == null || input1.length()==0 || input2.length()==0)return 0;int[][] dp = new int[input1.length()][input2.length()];//初始值,有三种情况if(input1.charAt(0)==input2.charAt(0))//情况1dp[0][0] = 1;elsedp[0][0] = 0;for(int i=1;i<input2.length();i++){//情况2if(input1.charAt(0)==input2.charAt(i)){dp[0][i] = 1;}else{dp[0][i] = dp[0][i-1];}}for(int i=1;i<input1.length();i++){//情况3if(input1.charAt(i)==input2.charAt(0)){dp[i][0] = 1;}else{dp[i][0] = dp[i-1][0];}}//一般情况for(int i=1;i<input1.length();i++)for(int j=1;j<input2.length();j++){if(input1.charAt(i)==input2.charAt(j)){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[input1.length()-1][input2.length()-1];}





原创粉丝点击