import java.util.Scanner;
/**
* 最⻓公共⼦序列长度
* */
public class DP6 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1 = sc.next();
String str2 = sc.next();
DP6 dp6 = new DP6();
int res = dp6.dp(str1, str2);
System.out.println(res);
}
public int dp(String str1,String str2){
int m=str1.length();
int n=str2.length();
int[][] dp = new int[m + 1][n + 1];
//base case
//第0行,空字符串 "" 与任何字符串的最长公共子序列长度都是0
for (int i = 0; i<n+1 ; i++) {
dp[0][i]=0;
}
//第0列,空字符串 "" 与任何字符串的最长公共子序列长度都是0
for (int i = 0; i<m+1 ; i++) {
dp[i][0]=0;
}
for (int i = 1; i<m+1 ; i++) {
for (int j = 1; j<n+1 ; j++) {
if (str1.toCharArray()[i-1]==str2.toCharArray()[j-1]){
//找到一个相同的字符,最长子串长度加1
dp[i][j]=1+dp[i-1][j-1];
}else{
//str1[i] 和 str2[j] 这两个字符⾄少有⼀个不在 最长公共子序列 中,需要丢弃⼀个
//尝试两种情况,取更⼤的结果
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
return dp[m][n];
}
}
记录---最长公共子序列问题(动态规划)
最新推荐文章于 2022-05-05 20:17:14 发布