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

最长公共子序列(二)

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());
    }
    
}
全部评论

相关推荐

05-12 17:28
已编辑
门头沟学院 硬件开发
ldf李鑫:不说公司名祝你以后天天遇到这样的公司
点赞 评论 收藏
分享
05-07 17:58
门头沟学院 Java
wuwuwuoow:1.简历字体有些怪怪的,用啥写的? 2.Redis 一主二从为什么能解决双写一致性? 3.乐观锁指的是 SQL 层面的库存判断?比如 stock > 0。个人认为这种不算乐观锁,更像是乐观锁的思想,写 SQL 避免不了悲观锁的 4.奖项证书如果不是 ACM,说实话没什么必要写 5.逻辑过期时间为什么能解决缓存击穿问题?逻辑过期指的是什么 其实也没什么多大要改的。海投吧
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务