刷题24-求两个字符串的最长公共子序列的长度

原题链接

题目描述

给定两个字符串str1和str2,输出连个字符串的最长公共子序列。
如过最长公共子序列为空,则输出-1。

输入描述

输出包括两行,第一行代表字符串str1,第二行代表str2。
(1≤length(str1),length(str2)≤5000)

输出描述

输出一行,代表他们最长公共子序列。如果公共子序列的长度为空,则输出-1。

示例

输入:
1A2C3D4B56
B1D23CA45B6A
输出:
123456
说明:
"123456"和“12C4B6”都是最长公共子序列,任意输出一个。

找了两个图片便于理解
图一:
刷题24-求两个字符串的最长公共子序列的长度_第1张图片
图二:
刷题24-求两个字符串的最长公共子序列的长度_第2张图片

最长公共子序列,最大值一定会出现在最后一个格子里。
参考链接

参考代码

import java.util.Scanner;

public class Main {
     

    public static String process(String str1, String str2) {
     
        if (str1 == null || str1.length() == 0 || str2 == null || str2.length() == 0) {
     
            return "";
        }
        char[] char1 = str1.toCharArray();
        char[] char2 = str2.toCharArray();
        int[][] dp = dp(char1, char2);
        int m = str1.length() - 1;
        int n = str2.length() - 1;
        char[] res = new char[dp[m][n]];
        int index = res.length - 1;

        while (index >= 0) {
     
            if (n > 0 && dp[m][n] == dp[m][n - 1]) {
     
                n--;
            } else if (m > 0 && dp[m][n] == dp[m - 1][n]) {
     
                m--;
            } else {
     
                res[index--] = char1[m];
                m--;
                n--;
            }
        }

        return String.valueOf(res);
    }

    public static int[][] dp(char[] str1, char[] str2) {
     
        int[][] dp = new int[str1.length][str2.length];
        dp[0][0] = str1[0] == str2[0] ? 1 : 0;

        for (int i = 1; i < str1.length; i++) {
     
            dp[i][0] = Math.max(dp[i - 1][0], str1[i] == str2[0] ? 1 : 0);
        }
        for (int i = 1; i < str2.length; i++) {
     
            dp[0][i] = Math.max(dp[0][i - 1], str2[i] == str1[0] ? 1 : 0);
        }
        for (int i = 1; i < str1.length; i++) {
     
            for (int j = 1; j < str2.length; j++) {
     
                int max = Math.max(dp[i - 1][j], dp[i][j - 1]);
                if (str1[i] == str2[j]) {
     
                    max = Math.max(dp[i - 1][j - 1] + 1, max);
                }
                dp[i][j] = max;
            }
        }
        return dp;
    }

    public static void main(String[] args) {
     
        Scanner sc = new Scanner(System.in);
        String str1 = sc.next();
        String str2 = sc.next();
        System.out.println(process(str1, str2));
    }
}

你可能感兴趣的:(算法与数据结构,字符串,算法,动态规划,leetcode)