|
|
|
@ -1,7 +1,14 @@
|
|
|
|
|
package 第03期.mca_09;
|
|
|
|
|
|
|
|
|
|
// 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度
|
|
|
|
|
// 如果不存在 公共子序列 ,返回 0
|
|
|
|
|
// 一个字符串的 子序列 是指这样一个新的字符串:
|
|
|
|
|
// 它是由原字符串在不改变字符的相对顺序的情况下
|
|
|
|
|
// 删除某些字符(也可以不删除任何字符)后组成的新字符串
|
|
|
|
|
// 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列
|
|
|
|
|
// 两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列
|
|
|
|
|
// 这个问题leetcode上可以直接测
|
|
|
|
|
// 链接:https://leetcode.com/problems/longest-common-subsequence/
|
|
|
|
|
// 链接:https://leetcode.cn/problems/longest-common-subsequence/
|
|
|
|
|
public class Code06_LongestCommonSubsequence {
|
|
|
|
|
|
|
|
|
|
public static int longestCommonSubsequence1(String s1, String s2) {
|
|
|
|
@ -24,16 +31,16 @@ public class Code06_LongestCommonSubsequence {
|
|
|
|
|
// 但是可以肯定,答案不会超过这四种可能性的范围
|
|
|
|
|
// 那么我们分别来看一下,这几种可能性怎么调用后续的递归。
|
|
|
|
|
// a) 最长公共子序列,一定不以str1[i]字符结尾、也一定不以str2[j]字符结尾
|
|
|
|
|
// 如果是这种情况,那么有没有str1[i]和str2[j]就根本不重要了,因为这两个字符一定没用啊
|
|
|
|
|
// 所以砍掉这两个字符,最长公共子序列 = str1[0...i-1]与str2[0...j-1]的最长公共子序列长度(后续递归)
|
|
|
|
|
// 如果是这种情况,那么有没有str1[i]和str2[j]就根本不重要了,因为这两个字符一定没用啊
|
|
|
|
|
// 所以砍掉这两个字符,最长公共子序列 = str1[0...i-1]与str2[0...j-1]的最长公共子序列长度(后续递归)
|
|
|
|
|
// b) 最长公共子序列,可能以str1[i]字符结尾、但是一定不以str2[j]字符结尾
|
|
|
|
|
// 如果是这种情况,那么我们可以确定str2[j]一定没有用,要砍掉;但是str1[i]可能有用,所以要保留
|
|
|
|
|
// 所以,最长公共子序列 = str1[0...i]与str2[0...j-1]的最长公共子序列长度(后续递归)
|
|
|
|
|
// 如果是这种情况,那么我们可以确定str2[j]一定没有用,要砍掉;但是str1[i]可能有用,所以要保留
|
|
|
|
|
// 所以,最长公共子序列 = str1[0...i]与str2[0...j-1]的最长公共子序列长度(后续递归)
|
|
|
|
|
// c) 最长公共子序列,一定不以str1[i]字符结尾、但是可能以str2[j]字符结尾
|
|
|
|
|
// 跟上面分析过程类似,最长公共子序列 = str1[0...i-1]与str2[0...j]的最长公共子序列长度(后续递归)
|
|
|
|
|
// 跟上面分析过程类似,最长公共子序列 = str1[0...i-1]与str2[0...j]的最长公共子序列长度(后续递归)
|
|
|
|
|
// d) 最长公共子序列,必须以str1[i]字符结尾、也必须以str2[j]字符结尾
|
|
|
|
|
// 同时可以看到,可能性d)存在的条件,一定是在str1[i] == str2[j]的情况下,才成立的
|
|
|
|
|
// 所以,最长公共子序列总长度 = str1[0...i-1]与str2[0...j-1]的最长公共子序列长度(后续递归) + 1(共同的结尾)
|
|
|
|
|
// 同时可以看到,可能性d)存在的条件,一定是在str1[i] == str2[j]的情况下,才成立的
|
|
|
|
|
// 所以,最长公共子序列总长度 = str1[0...i-1]与str2[0...j-1]的最长公共子序列长度(后续递归) + 1(共同的结尾)
|
|
|
|
|
// 综上,四种情况已经穷尽了所有可能性。四种情况中取最大即可
|
|
|
|
|
// 其中b)、c)一定参与最大值的比较,
|
|
|
|
|
// 当str1[i] == str2[j]时,a)一定比d)小,所以d)参与
|
|
|
|
|