dp-最长子序列问题
package dp.longestCommonSubsequence;
/**
* Created on 2022/1/5.
*
* @author
*/
/**
* 最⻓公共⼦序列(Longest Common Subsequence,
* 简称 LCS)是⼀道⾮常经 典的⾯试题⽬,因为它的解法是典型的⼆维动态规划,
* ⼤部分⽐较困难的字 符串问题都和这个问题⼀个套路,⽐如说编辑距离。
* ⽽且,这个算法稍加改 造就可以⽤于解决其他问题,所以说 LCS 算法是值得掌握的。
* 题⽬就是让我们求两个字符串的 LCS ⻓度:
* 输⼊: str1 = "abcde", str2 = "ace"
* 输出: 3
* 解释: 最⻓公共⼦序列是 "ace",它的⻓度是 3 肯定有读者会问,
* 为啥这个问题就是动态规划来解决呢?因为⼦序列类型的 问题,穷举出所有可能的结果都不容易,
* ⽽动态规划算法做的就是穷举 + 剪枝,它俩天⽣⼀对⼉。所以可以说只要涉及⼦序列问题,
* ⼗有⼋九都需要 动态规划来解决,往这⽅⾯考虑就对了。
*/
public class longestCommonSubsequence {
public static int longestCommonSubsequence(String str1, String str2) {
if (str1 == "" || str2 == "") {
return 0;
}
int[][] dp = new int[str1.length() + 1][str2.length() + 1];
char[] char1 = str1.toCharArray();
char[] char2 = str2.toCharArray();
for (int i = 1; i <= str1.length(); i++) {
for (int j = 1; j <= str2.length(); j++) {
if (char1[i - 1] == char2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[str1.length()][str2.length()];
}
public static void main(String[] args) {
String str1 = "abcde";
String str2 = "ace";
System.out.println(longestCommonSubsequence(str1, str2));
}
}
不恋尘世浮华,不写红尘纷扰