无重复的最长公共子序列怎么求!!

给两个字符串集合含有重复字符,例如abaabc和bcbaabc,输出结果bac。求他们无重复的最长公共子序列。RFLCS问题!!!

该回答引用ChatGPT

这个问题可以转化为无重复字符的最长公共子序列问题。可以使用动态规划算法来解决。

定义一个二维数组dp,其中dp[i][j]表示s1的前i个字符和s2的前j个字符的最长公共子序列的长度。初始化dp[0][j]和dp[i][0]为0。状态转移方程如下:

如果s1[i-1]等于s2[j-1],则dp[i][j]=dp[i-1][j-1]+1
如果s1[i-1]不等于s2[j-1],则dp[i][j]=max(dp[i-1][j], dp[i][j-1])
最后返回dp[m][n]即为两个字符串集合的无重复的最长公共子序列的长度。

以下是Java代码实现:


public static int longestCommonSubsequenceWithoutDuplicates(String[] s1, String[] s2) {
    int m = s1.length, n = s2.length;
    int[][] dp = new int[m+1][n+1];
    for (int i = 0; i <= m; i++) {
        dp[i][0] = 0;
    }
    for (int j = 0; j <= n; j++) {
        dp[0][j] = 0;
    }
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (s1[i-1].equals(s2[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]);
            }
        }
    }
    return dp[m][n];
}