1. 题目

2. 思路
(1) 动态规划
- dp[i][j]表示s1中下标为[0,i)的子字符串与s2中下标为[0,j)的子字符串的最长公共子序列。
- 若chars[i-1]==chars[j-1],则dp[i][j]=dp[i-1][j-1]+chars[i-1];否则,dp[i][j]取dp[i-1][j]和dp[i][j-1]中较长的一个。
3. 代码
public class Test {
public static void main(String[] args) {
}
}
class Solution {
public String LCS(String s1, String s2) {
char[] chars1 = s1.toCharArray();
char[] chars2 = s2.toCharArray();
int n1 = chars1.length;
int n2 = chars2.length;
String[][] dp = new String[n1 + 1][n2 + 1];
for (int i = 0; i <= n1; i++) {
dp[i][0] = "";
}
for (int i = 0; i <= n2; i++) {
dp[0][i] = "";
}
for (int i = 1; i <= n1; i++) {
for (int j = 1; j <= n2; j++) {
if (chars1[i - 1] == chars2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + chars1[i - 1];
} else {
if (dp[i - 1][j].length() > dp[i][j - 1].length()) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = dp[i][j - 1];
}
}
}
}
return dp[n1][n2].equals("") ? "-1" : dp[n1][n2];
}
}