题解 | #最长公共子序列(二)#

最长公共子序列(二)

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 void f1(String s1,String s2,int[][]dp){
        char []str1=s1.toCharArray();
        char []str2=s2.toCharArray();
        for(int i=1;i<dp.length;i++){
            for(int j=1;j<dp[i].length;j++){
                //dp[i][j]的值只可能来源于三个地方
                dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
                if(str1[i]==str2[j]){
                    dp[i][j]=Math.max(dp[i][j],dp[i-1][j-1]+1);
                }
            }
        }
    }
    public String LCS (String s1, String s2) {
        // write code here
        if(s1.equals("")||s2.equals("")){//两个字符串有一个为空直接返回-1
            return "-1";
        }
        int n=s1.length();
        int m=s2.length();
        char []str1=s1.toCharArray();
        char []str2=s2.toCharArray();
        int [][]dp=new int[n][m];//dp[i][j]的含义为S1[0..i]和s2[0..j]的最长序列长度
        //初始化dp数组
        if(str1[0]==str2[0])
            dp[0][0]=1;
        //初始化dp第一行
        for(int j=1;j<dp[0].length;j++){
            dp[0][j]=Math.max(dp[0][j-1],str1[0]==str2[j]?1:0);
        }
        //初始化第一列
        for(int i=1;i<dp.length;i++){
            dp[i][0]=Math.max(dp[i-1][0],str1[i]==str2[0]?1:0);
        }
        f1(s1,s2,dp);
        char []res=new char[dp[n-1][m-1]];//开辟一个和最长序列一样长的结果数组
        int index=dp[n-1][m-1];
        if(index==0){
            return "-1";
        }
        n--;m--;
        while(index>0){
            if(m>0&&dp[n][m-1]==dp[n][m]){
                m--;
            }
            else if(n>0&&dp[n-1][m]==dp[n][m]){
                n--;
            }
            else{
                res[--index]=str1[n];
                n--;m--;
            }
        }
        return String.valueOf(res);
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务