最长公共子序列LCS
2017-10-17 15:38
183 查看
最长公共子序列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;
else
return LCS(input1, input2, i, j - 1);
}
if (j == 0) {
if (input1.charAt(i) == input2.charAt(j))
return 1;
else
return 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))//情况1
dp[0][0] = 1;
else
dp[0][0] = 0;
for(int i=1;i<input2.length();i++){//情况2
if(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++){//情况3
if(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];
}
举个栗子: "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;
else
return LCS(input1, input2, i, j - 1);
}
if (j == 0) {
if (input1.charAt(i) == input2.charAt(j))
return 1;
else
return 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))//情况1
dp[0][0] = 1;
else
dp[0][0] = 0;
for(int i=1;i<input2.length();i++){//情况2
if(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++){//情况3
if(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];
}
相关文章推荐
- 求解最长公共子序列(Longest Common Subsequence,LCS)
- 最长公共子序列 LCS
- LCS最长公共子序列(最优线性时间O(n))
- 算法复习之::LCS最长公共子序列
- 动态规划之最长公共子序列(LCS)
- 【PAT 1045】 Favorite Color Stripe 最长公共子序列LCS
- LCS(最长公共子序列)、LIS(最长上升子序列)、LCIS(最长公共上升子序列)
- 最长公共子序列(LCS)
- 动态规划6-LCS(最长公共子序列)
- 动态规划算法解最长公共子序列LCS问题
- 【动态规划】 之最长公共子序列LCS
- HUNNU 11313 最长公共子序列(LCS)
- 编程之美3.3——类似——两个字符串的最长公共子序列(LCS)
- 《算法导论》读书笔记之动态规划—最长公共子序列 & 最长公共子串(LCS)
- LCS 最长公共子序列
- 51nod 1006:最长公共子序列Lcs
- 动态规划之最长公共子序列(LCS)
- LCS最长公共子序列~dp学习~4
- LCS(求出最长公共子序列长度)
- 动态划归:最长公共子串和最长公共子序列--LCS