美文网首页
2个字符串的最长公共子序列(java)

2个字符串的最长公共子序列(java)

作者: 吃番茄的土拨鼠 | 来源:发表于2018-07-29 08:53 被阅读0次
import java.util.ArrayList;

public class MaxCommStr {

    public static void main(String[] args) {

        String a = "damdfac";
        String b = "aadafcefc";
        String resutString = findComString(a, b);
        System.out.println(resutString);
    }

    public static String findComString(String a, String b) {
        //  a的第i个和b的第j个最大公共子序列长度:如果第i和第j个字符相同,则为a的i-1和b的j-1最大公共子序列长度+1.
 //否则取 a的第i-1个b的j个与a的i个b的j-1个中最大的。因为对比a[i-1][j-1],要不是新增的a[i]个字符与前b[j-1]的字符产生了新的匹配,要不是增加的b[j]个字符与a[i-1]个字符产生了新的匹配。如果新增的a[i]和b[j]都贡献了,(如字符串ad和da,在i=1,j=1时,a[1]=d与下面的字符产生了匹配,同时b[1]=a与前者产生匹配)。因为是序列,新增的匹配要作为最后一位,所以只能任选一个作为新增的匹配。
        int[][] matrix = new int[a.length() + 1][b.length() + 1];
        for (int i = 0; i < a.length(); i++) {
            for (int j = 0; j < b.length(); j++) {
                if (a.charAt(i) == b.charAt(j)) {
                    int maxLen = (i == 0 || j == 0) ? 0 : matrix[i - 1][j - 1];
                    matrix[i][j] = maxLen + 1;
                } else {
                    int maxLen = (i == 0 || j == 0) ? 0 : Math.max(
                            matrix[i - 1][j], matrix[i][j - 1]);
                    matrix[i][j] = maxLen;
                }
            }
        }

        int i = a.length() - 1;
        int j = b.length() - 1;
        ArrayList<Character> restList = new ArrayList<Character>();
        while (i >= 0 && j >= 0) {
            if (a.charAt(i) == b.charAt(j)) {
                restList.add(a.charAt(i));
                i--;
                j--;
            } else {
                if (matrix[i - 1][j] >= matrix[i][j - 1]) {
                    i--;
                } else {
                    j--;
                }
            }
        }
        StringBuilder reBuilder = new StringBuilder(restList.size());
        for (int k = restList.size() - 1; k >= 0; k--) {
            reBuilder.append(restList.get(k));
        }
        return reBuilder.toString();
    }

}

相关文章

  • 字符串算法

    最长公共前缀 最长回文串 最长回文子序列 最长公共子串 反转单词顺序列 反转字符串 字符串转数字 IP-int互转

  • 序列比对(二十四)——最长公共子序列

    原创:hxj7 本文介绍如何求解两个字符串的最长公共子序列。 最长公共子序列问题 前文《序列比对(23)最长公共子...

  • lintcode 最长公共子序列

    给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。说明最长公共子序列的定义: 最长公共子序列问题是在...

  • Java算法:求两个字符串的最长公共子序列问题

    最长公共子序列问题: 给定两个字符串A、B,求A与B的最长公共子序列(子序列不要求是连续的)举例:字符串A: ab...

  • 2019-10-29

    求2个字符串的最长公共子序列和最长公共子字符串 一. 最长公共子序列 定义: 一个数列S,如果分别是两个或多个已知...

  • 每天一道算法题18

    【最长公共子序列,子串】给定两个字符串上str1 和 str2, 求两个字符的最长公共子序列和最长公共子串。 最长...

  • 最长公共子序列问题解析

    问题解读 最长公共子序列问题,就是找出两个字符串中,存在的最长的子序列 什么是子序列呢?子序列不同于公共子串,子串...

  • 公共子序列问题

    最长公共子序列 最长上升子序列 最长公共上升子序列

  • 子序列

    最长公共子序列(LCS)(lintcode 77) 描述:给出两个字符串,找到最长公共子序列(LCS),返回LCS...

  • 2018-08-09

    动态规划之最长公共子序列 问题描述 给定两个字符串,求解两个字符串的最长公共子序列。比如字符串1:BDCABA;字...

网友评论

      本文标题:2个字符串的最长公共子序列(java)

      本文链接:https://www.haomeiwen.com/subject/brhzmftx.html