(算法思路详见《算法导论(第3版)》15.4 最长公共子序列 )
public class Solution {
private static final String EMPTY = "-1";
private String currLCS = "";
/**
* 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 || s1.isEmpty() || s2 == null || s2.isEmpty()) return EMPTY;
int[][] c = new int[s1.length()+1][s2.length()+1];
StringBuilder rsb = new StringBuilder();
LCSLength(s1.toCharArray(),s2.toCharArray(),c);
LCSPrint(c,s1.length(),s2.length(),rsb,s1.toCharArray(),s2.toCharArray());
if (rsb.length() == 0) return EMPTY;
return rsb.toString();
}
private void LCSPrint(int[][] c, int i, int j, StringBuilder rsb, char[] x, char[] y) {
if (i == 0 || j == 0) return;
if (x[i - 1] == y[j - 1]){
LCSPrint(c,i-1,j-1,rsb,x,y);
rsb.append(x[i-1]);
}
else if(c[i - 1][j] >= c[i][j - 1]){
LCSPrint(c,i-1,j,rsb,x,y);
}
else {
LCSPrint(c,i,j-1,rsb,x,y);
}
}
private void LCSLength(char[] x, char[] y, int[][] c) {
for (int i = 0,j = 1; j < c[0].length; j++) {
c[i][j] = 0;
}
for (int i = 1,j = 0; i < c.length; i++) {
c[i][j] = 0;
}
for (int i = 1;i < c.length; i++) {
for (int j = 1; j < c[0].length; j++) {
if (x[i - 1] == y[j - 1]){
c[i][j] = c[i - 1][j - 1]+1;
}
else if(c[i - 1][j] >= c[i][j - 1]){
c[i][j] = c[i - 1][j];
}
else {
c[i][j] = c[i][j - 1];
}
}
}
}
}