前言
之前入门算法用代码随想录(代码随想录),将递归,动态规划这些都学了一遍,也自己动手实现过,但之前也是边参考边写出来的,而且隔了有一段时间了,最近二刷一次!!这次挑战尽量自己写出来。
链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
代码
public class _32_1143_最长公共子序列 {
public static void main(String[] args) {
System.out.println(longestCommonSubsequence("abcde", "ace"));
}
/**
* 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
* <p>
* 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
* <p>
* 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。
* 两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
*/
public static int longestCommonSubsequence(String text1, String text2) {
// dp:因为没有要求连续,所以并不需要。以尾部元素结尾这一个条件。
int[][] dp = new int[text1.length() + 1][text2.length() + 1];
for (int i = 1; i <= text1.length(); i++) {
for (int j = 1; j <= text2.length(); j++) {
if (text1.charAt(i - 1) == text2.charAt(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[text1.length()][text2.length()];
}
}