题解 | #最长公共子序列-II#
最长公共子序列-II
http://www.nowcoder.com/practice/6d29638c85bb4ffd80c020fe244baf11
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||s1.length()==0||s2==null||s2.length()==0){
return "-1";
}
int len1 = s1.length();
int len2 = s2.length();
int[][] arr = new int[len1+1][len2+1];
for(int i=0;i<len1+1;i++){
for(int j=0;j<len2+1;j++){
if(i==0||j==0){
arr[i][j]=0;
}else if(s1.charAt(i-1)==s2.charAt(j-1)){
arr[i][j] = arr[i-1][j-1]+1;
}else{
arr[i][j] = arr[i-1][j]>arr[i][j-1]?arr[i-1][j]:arr[i][j-1];
}
}
}
//找出一个最长的公共子序列
StringBuilder sb = new StringBuilder();
int s1L = len1, s2L = len2;
while(s1L != 0 && s2L != 0){
if (s1.charAt(s1L-1) == s2.charAt(s2L-1)){
sb.append(s1.charAt(s1L - 1));
s1L--;
s2L--;
}else{
if (arr[s1L-1][s2L] > arr[s1L][s2L-1]){
s1L--;
}else{
s2L--;
}
}
}
return sb.length() == 0?"-1":sb.reverse().toString();
}
}