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) {
if(s1 == null || s2 == null || s1.length() == 0 || s2.length() == 0) return "-1" ;
char[] arr1 = s1.toCharArray() ;
char[] arr2 = s2.toCharArray() ;
int len1 = arr1.length ;
int len2 = arr2.length ;
//dp[i][j]表示arr1前i个字符和arr2的前j个字符的最长公共子序列的长度
int[][] dp = new int[len1 + 1][len2 + 1] ;
//面对arr1前i个字符和arr2的前j个字符时要得到最长公共子序列的选择
int[][] pai = new int[len1 + 1][len2 + 1] ;
for(int i = 0 ; i <= len1 ; i ++) {
for(int j = 0 ; j <= len2 ; j ++) {
if(j == 0 || i == 0) {
dp[i][j] = 0 ;
} else {
dp[i][j] = Math.max(dp[i-1][j] , dp[i][j-1]) ;
if(dp[i][j] == dp[i-1][j]) {
pai[i][j] = 1 ;//选择了dp[i-1][j]
} else {
pai[i][j] = 2 ;//选择了dp[i][j-1]
}
if(arr1[i-1] == arr2[j-1]) {
dp[i][j] = Math.max(dp[i][j] , dp[i-1][j-1] + 1) ;
if(dp[i][j] == dp[i-1][j-1] + 1) {
pai[i][j] = 3 ;//选择了dp[i-1][j-1]
}
}
}
}
}
int maxLen = dp[len1][len2] ;
if (maxLen == 0) return "-1" ;
char[] res = new char[maxLen] ;//存储最长公共子序列
int p = maxLen - 1 ;
int i = len1 ;
int j = len2 ;
while(i > 0 && j > 0) {
if(pai[i][j] == 1) {
i -- ;
} else if(pai[i][j] == 2) {
j -- ;
} else {
res[p--] = arr1[i - 1] ;
i -- ;
j -- ;
}
}
return new String(res) ;
}
}