动态规划的最长公共子序列算法的Java实现

该文章提供了一个使用Java实现动态规划算法来找到两个字符串的最长公共子序列的方法。代码中详细解释了逻辑,包括初始化二维数组dp,填充dp数组以及回溯过程来获取最长公共子序列。最后,通过示例展示了如何应用这个算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 动态规划的最长公共子序列算法的Java实现,代码中有详细的注释说明每一步的逻辑

public class LongestCommonSubsequence {
    public static int[][] findLCS(char[] s1, char[] s2) {
        // 初始化二维数组dp,dp[i][j]表示s1[0...i-1]和s2[0...j-1]的最长公共子序列的长度
        int[][] dp = new int[s1.length+1][s2.length+1];
        
        // 填充第一行和第一列为0,因为当一个字符串为空时,它们的最长公共子序列为0
        for (int i = 0; i <= s1.length; i++) {
            dp[i][0] = 0;
        }
        for (int j = 0; j <= s2.length; j++) {
            dp[0][j] = 0;
        }
        
        // 动态规划填充dp数组
        for (int i = 1; i <= s1.length; i++) {
            for (int j = 1; j <= s2.length; j++) {
                if (s1[i-1] == 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;
    }
    
    public static String getLCS(int[][] dp, char[] s1, char[] s2) {
        int i = s1.length, j = s2.length;
        StringBuilder sb = new StringBuilder();
        
        // 从dp数组的右下角开始回溯
        while (i > 0 && j > 0) {
            if (s1[i-1] == s2[j-1]) {
                // 如果s1[i-1]等于s2[j-1],那么这个字符一定属于最长公共子序列
                sb.append(s1[i-1]);
                i--;
                j--;
            } else {
                // 否则,比较dp[i-1][j]和dp[i][j-1]的值,选择其中较大的那个方向回溯
                if (dp[i-1][j] > dp[i][j-1]) {
                    i--;
                } else {
                    j--;
                }
            }
        }
        
        // 最长公共子序列是逆序存储的,需要反转字符串
        return sb.reverse().toString();
    }
    
    public static void main(String[] args) {
        String s1 = "ABCD";
        String s2 = "EACBFD";
        char[] c1 = s1.toCharArray();
        char[] c2 = s2.toCharArray();
        
        int[][] dp = findLCS(c1, c2);
        String lcs = getLCS(dp, c1, c2);
        
        System.out.println("最长公共子序列的长度为:" + dp[c1.length][c2.length]);
        System.out.println("最长公共子序列为:" + lcs);
    }
}

### 回答1: Active Directory服务是种由微软公司开发的网络服务,它提供了种集中管理和控制网络资源的方式。它可以在中集中管理用户、计算机、应用程序和其他网络资源,从而提高了网络的安全性和可管理性。Active Directory服务还提供了些高级功能,如单点登录、组策略管理和名系统(DNS)集成等,使得网络管理员可以更加轻松地管理和维护网络。 ### 回答2: Active Directory服务(Active Directory Domain Services,简称AD DS)是微软公司的项用于管理和组织网络资源的目录服务。它是种基于LDAP(轻量级目录访问协议)的目录服务,可以让用户和管理员方便地管理和访问网络中的资源。 AD DS的主要功能包括用户身份认证、访问控制、组管理和资源管理等。通过AD DS,管理员可以集中管理和配置用户和计算机的访问权限,确保系统安全。同时,AD DS还提供了的集中管理功能,管理员可以通过控制器管理中的所有对象,并在中实施策略。 AD DS还支持单点登录功能,用户只需在登录到之后,即可自动访问到所属中的资源,而无需再次输入用户名和密码。这大大提高了用户的工作效率。 此外,AD DS还支持多架构,可以通过建立信任关系实现跨资源的访问和管理。管理员可以维护多个之间的信任关系,实现用户和资源的统管理。 总而言之,AD DS是种强大的目录服务,可以实现用户和资源的集中管理和访问控制,提高网络系统的稳定性和安全性。它是企业网络管理的重要组成部分,为企业提供了高效的身份认证和资源管理功能,增强了企业的生产力和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值