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

最长公共子序列(二)

http://www.nowcoder.com/practice/6d29638c85bb4ffd80c020fe244baf11

若题目要求所有可能的LCS,那么此解法应该可行?没有数据可以测,这样交上去是对的~

import java.util.*;


public class Solution {
    /**
     * longest common subsequence
     * @param s1 string字符串 the string
     * @param s2 string字符串 the string
     * @return string字符串
     */
    
    int[][] dp;
    
    public String LCS (String s1, String s2) {
        if(s1 == null || s2 == null || s1.length() == 0 || s2.length() == 0) return "-1";
        // write code here
        char[] c1 = s1.toCharArray();
        char[] c2 = s2.toCharArray();
        int[][] dp = new int[s1.length() + 1][s2.length() + 1];
        for(int i = 1;i <= s1.length();i++){
            for(int j = 1;j <= s2.length();j++){
                if(c1[i - 1] == c2[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]);
            }
        }
        if(dp[s1.length()][s2.length()] == 0) return "-1";
        Set<String> ans = new HashSet<>();
        this.dp = dp;
        dfs(c1,c2,s1.length(),s2.length(),new StringBuilder(),ans);
        System.out.println(ans);
        Iterator<String> it = ans.iterator();
        return it.next();
    }
    
    private void dfs(char[] c1,char[] c2,int i,int j,StringBuilder sb,Set<String> ans){
        while(i > 0 && j > 0){
            if(c1[i - 1] == c2[j - 1]){
                sb.append(c1[i - 1]);
                i--;
                j--;
            }
            else{
                if(dp[i - 1][j] > dp[i][j - 1]) i--;
                else if(dp[i - 1][j] < dp[i][j - 1]) j--;
                else{
                    dfs(c1,c2,i - 1,j,new StringBuilder(sb),ans);
                    dfs(c1,c2,i,j - 1,new StringBuilder(sb),ans);
                    return;
                }
            }
        }
        ans.add(new StringBuilder(sb).reverse().toString());
    }
    
}
全部评论

相关推荐

神哥不得了:神哥来啦~ JVm可以写在juc的下面,另外的话,项目亮点的话再重新用star法则再改一遍,其余的东西写的还是非常的好的
点赞 评论 收藏
分享
03-21 08:46
已编辑
门头沟学院 C++
一个什么都不会的学生:当你有硕士学历的时候HR会说就是比本科生强
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务