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

最长公共子序列(二)

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

import java.util.*;
public class Solution {
    /**
     * 定义 dp[i][j] 表示 str1前 i 个字符 和 str2前 j 个字符的公共子序列长度
     * 分解:1. str1[i] = str2[j] 的情况,即 dp[i][j] = dp[i - 1][j - 1] + 1
     * 2. str1[i] != str2[j] 的情况,即 dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
     * 然后回溯子序列,从两个串的最后一个字符开始
     * 如果 str1[i] = str2[j],则包含在子序列里,向左上角移动
     * 如果 str1[i] != str2[j],则不包含在子序列里,向左或者向上移动,哪个大就向哪个移动
     */
    public String LCS(String str1, String str2) {
        int[][] dp = new int[str1.length() + 1][str2.length() + 1];
        for (int i = 1; i <= str1.length(); i++) {
            for (int j = 1; j <= str2.length(); j++) {
                if (str1.charAt(i - 1) == str2.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]);
                }
            }
        }
        StringBuilder sb = new StringBuilder();
        int len1 = str1.length(), len2 = str2.length();
        while (len1 > 0 && len2 > 0) {
            if (str1.charAt(len1 - 1) == str2.charAt(len2 - 1)) {
                sb.append(str1.charAt(len1 - 1));
                len1--;
                len2--;
            } else {
                if (dp[len1 - 1][len2] > dp[len1][len2 - 1]) {
                    len1--;
                } else {
                    len2--;
                }
            }
        }
        if (sb.length() == 0) {
            return "-1";
        }
        return sb.reverse().toString();
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务