package shousi;
/**
* 求最长公共子序列(LCS) 动态规划
*/
public class Test50 {
public static String findLCS(String a,String b) {
int alen = a.length();
int blen = b.length();
int[][] dp = new int[alen + 1][blen + 1];
for(int i = 0;i <= alen;i++) {
for(int j = 0;j <= blen;j++) {
dp[i][j] = 0;
}
}
for(int i = 0;i < alen;i++) {
for(int j = 0;j < blen;j++) {
if(i == 0||j == 0){
if(a.charAt(i) == b.charAt(j)) {
dp[i][j] = 1;
}
else{
dp[i][j] = 0;
}
//跳过本次循环体中余下尚未执行的语句
continue;
}
if(a.charAt(i) == b.charAt(j)) {
dp[i][j] = dp[i - 1][j - 1] + 1;
}else {
dp[i][j] = dp[i - 1][j] > dp[i][j - 1] ? dp[i - 1][j] : dp[i][j - 1];
}
}
}
String ans = "";
for(int i = alen - 1,j = blen -1 ;i >= 0 && j >= 0;) {
if(a.charAt(i) == b.charAt(j)) {
ans += a.charAt(i);
i--;j--;
}else if(dp[i-1][j] > dp[i][j-1]){
i--;
}else {
j--;
}
}
return new StringBuilder(ans).reverse().toString();
}
public static void main(String[] args) {
String res = findLCS("1d2ef3","d65e9f73");
System.out.print(res);
}
}
java 实现 最长公共子序列
最新推荐文章于 2023-06-04 23:23:44 发布