题目:最长公共子序列
思路:动态规划。
dp[i][j]
表示s1
以i
结尾,s2
以j
结尾的公共子序列长度,递推公式:
- 如果
str1[i] == str2[j]
,则dp[i][j] = dp[i - 1][j - 1] + 1
- 如果
str1[i] != str2[j]
,则dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1])
有了这个dp
数组,我们反推公共序列。从dp
数组的右下角开始:
- 如果两个字符相等,加入结果,然后下一步位置是左上角;
- 如果两个字符不相等,那么我们需要比较左侧和上侧的
dp
值,移动到更大的一个位置;如果两个值相等,说明多解,
代码:
import java.util.*;
public class Solution {
/**
* longest common subsequence
* @param s1 string字符串 the string
* @param s2 string字符串 the string
* @return string字符串
*/
public String LCS (String s1, String s2) {
// write code here
int s1Len = s1.length();
int s2Len = s2