思路:动态规划,有一个朋友讲的特别详细,可以去参考下,相信一定会有收获。
csdn地址:https://blog.csdn.net/hrn1216/article/details/51534607

public String LCS (String s1, String s2) {
        // write code here
        StringBuilder sb=new StringBuilder();
        int len1=s1.length();
        int len2=s2.length();
        int[][] dp=new int[len1+1][len2+1];
        //初始化dp数组
        for(int i=0;i<len1+1;i++){
            dp[i][0]=0;
        }
        for(int j=0;j<len2+1;j++){
            dp[0][j]=0;
        }
        //求解dp数组
        for(int i=1;i<len1+1;i++){
            for(int j=1;j<len2+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]);
                }
            }
        }
        //若没有公共子序列,返回-1
        if(dp[len1][len2]==0){
            return "-1";
        }
        //反向寻找路线
        int index1=len1;
        int index2=len2;
        while(dp[index1][index2]!=0 && index1>0 && index2>0){
            if(s1.charAt(index1-1)==s2.charAt(index2-1)){
                sb.append(s1.charAt(index1-1));
                index1--;
                index2--;
            }else{
                if(dp[index1][index2-1]>dp[index1-1][index2]){
                    index2--;
                }
                else{
                    index1--;
                }
            }
        }
        //由于是倒着寻找,需要再反转一下。
        return sb.reverse().toString();
    }