问题
给定两个字符,求两个字符串的最长公共子序列
(不需要连续,只需要保持字符的相对位置)
动态规划详解
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/836f8c60cea77f986270d0af31c9ea66.png)
题解
public class 最长公共子序列 {
public static int way1(String str1, String str2) {
if (str1 == null || str2 == null || str1.length() == 0 || str2.length() == 0) {
return 0;
}
int[][] dp = new int[str1.length()][str2.length()];
dp[0][0] = str1.charAt(0) == str2.charAt(0) ? 1 : 0;
for (int j = 1; j < str2.length(); j++) {
dp[0][j] = Math.max(dp[0][j-1], str1.charAt(0) == str2.charAt(j) ? 1 : 0);
}
for (int i = 1; i < str1.length(); i++) {
dp[i][0] = Math.max(dp[i-1][0], str1.charAt(i) == str2.charAt(0) ? 1 : 0);
}
for (int i = 1; i < str1.length(); i++) {
for (int j = 1; j < str2.length(); j++) {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
if (str1.charAt(i) == str2.charAt(j)) {
dp[i][j] = Math.max(dp[i][j], dp[i-1][j-1] + 1);
}
}
}
return dp[str1.length()-1][str2.length()-1];
}
public static void main(String[] args) {
System.out.println(way1("a123bc", "12dea3f"));
}
}