public String LCS (String s1, String s2) {
// 设置状态变量dp[i][j]:表示下标为[0,i-1]的s1和下标为[0,j-1]的s2的最长公共子序列的大小
int[][] dp=new int[s1.length()+1][s2.length()+1];
for (int i=1;i<s1.length()+1;i++){
for (int j=1;j<s2.length()+1;j++){
if (s1.charAt(i-1)==s2.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]);
}
}
}
int len1=s1.length();
int len2=s2.length();
StringBuilder sb = new StringBuilder();
while (len1>0&&len2>0){
//如果两个位置的字符相等,直接添加进sb中
if (s1.charAt(len1-1)==s2.charAt(len2-1)){
sb.append(s1.charAt(len1-1));
len1--;
len2--;
}else {//如果不相等,则要根据dp[][]来判断应该向哪个方向移动
if (dp[len1][len2-1]>dp[len1-1][len2]){//说明len2方向的有更多相同的字符,所以len2--
// 说明dp[len1][len2]==dp[len1][len2-1],
len2--;
}else {
len1--;
}
}
}
if (sb.length() == 0) return "-1";
return sb.reverse().toString();
}