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));
}
}
不恋尘世浮华,不写红尘纷扰
标签:
leetcode刷题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2020-01-05 Lc178-分数排名
2020-01-05 Lc177-第N高的薪水
2020-01-05 Lc7- 整数反转
2020-01-05 Lc5-最长回文子串
2020-01-05 关于学习小组第三篇分享总结-三十天如何让自己变成一个超级自律的人