问题描述:
题解:
public class Practice_最长公共子序列问题 {
public static void main(String[] args) {
//以下面两个字符串为例
String s1 = "sadstory";
String s2 = "adminsorry";
System.out.println(s1 + "与" + s2 + "的最长公共子序列长度为:" + dp(s1, s2));
}
//dp[i][j]表示s1字符串的i号位(包括i号位)之前的字符串与s2字符串的j号位(包括j号位)之前的字符串的最长公共子序列长度
//dp数组下标从1开始
private static int dp(String s1, String s2) {
int s1Len = s1.length();
int s2Len = s2.length();
int[][] dp = new int[s1Len + 1][s2Len + 1];
//初始化dp数组
for (int i = 1; i <= s1Len; i++) {
dp[i][0] = 0;
}
for (int i = 1; i <= s2Len; i++) {
dp[0][i] = 0;
}
for (int i = 1; i <= s1Len; i++) {
for (int j = 1; j <= s2Len; j++) {
//分两种情况 分别是s1.charAt(i)==s2.charAt(j) s1.charAt(i)!=s2.charAt(j)
if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1] + 1;//加一
} else if (s1.charAt(i - 1) != s2.charAt(j - 1)) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[s1Len][s2Len];
}
}