📌  相关文章
📜  用于检查给定字符串是否可以由其他两个字符串或其排列组成的Java程序(1)

📅  最后修改于: 2023-12-03 15:11:17.472000             🧑  作者: Mango

检查字符串是否可以由其他两个字符串或其排列组合而成的Java程序

介绍

本程序是用Java编写的,用于检查给定字符串是否可以由其他两个字符串或其排列组合而成。本程序还支持大小写敏感和忽略大小写两种模式。

代码实现

以下是程序的核心代码:

public static boolean isInterleaved(String s1, String s2, String s3, boolean caseSensitive) {
    if (s1.length() + s2.length() != s3.length()) {
        return false;
    }
    int m = s1.length();
    int n = s2.length();
    boolean[][] dp = new boolean[m + 1][n + 1];
    for (int i = 0; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            if (i == 0 && j == 0) {
                dp[i][j] = true;
            } else if (i == 0) {
                dp[i][j] = dp[i][j - 1] && ((caseSensitive && s2.charAt(j - 1) == s3.charAt(j - 1))
                        || (!caseSensitive && Character.toUpperCase(s2.charAt(j - 1)) == Character
                                .toUpperCase(s3.charAt(j - 1))));
            } else if (j == 0) {
                dp[i][j] = dp[i - 1][j] && ((caseSensitive && s1.charAt(i - 1) == s3.charAt(i - 1))
                        || (!caseSensitive && Character.toUpperCase(s1.charAt(i - 1)) == Character
                                .toUpperCase(s3.charAt(i - 1))));
            } else {
                dp[i][j] = (dp[i - 1][j] && ((caseSensitive && s1.charAt(i - 1) == s3.charAt(i + j - 1))
                        || (!caseSensitive && Character.toUpperCase(s1.charAt(i - 1)) == Character
                                .toUpperCase(s3.charAt(i + j - 1)))))
                        || (dp[i][j - 1] && ((caseSensitive && s2.charAt(j - 1) == s3.charAt(i + j - 1))
                                || (!caseSensitive && Character.toUpperCase(s2.charAt(j - 1)) == Character
                                        .toUpperCase(s3.charAt(i + j - 1)))));
            }
        }
    }
    return dp[m][n];
}

代码中,我们定义了一个名为 isInterleaved 的静态方法,在其中实现了判断字符串是否由其他两个字符串或其排列组合而成的逻辑,实现过程中使用了动态规划算法。具体来说,我们定义了一个 $dp$ 数组,其中 $dp[i][j]$ 表示 $s1$ 的前 $i$ 个字符和 $s2$ 的前 $j$ 个字符是否能够组成 $s3$ 的前 $i+j$ 个字符。然后,我们按照动态规划的思想,先初始化 $dp[0][0]$ 为 $true$,然后对 $dp$ 数组进行填充,最后返回 $dp[m][n]$,即 $s1$ 和 $s2$ 是否可以组成 $s3$。需要注意的是,在实现过程中我们还考虑了字符串是否大小写敏感的问题。

使用说明

为了使用本程序,您需要按照以下步骤操作:

  1. 将上述代码复制到您的 Java 项目中,或将其保存至一个以 .java 后缀结尾的文件中。
  2. 在您的 Java 代码中,使用 import 命令导入本程序所在的包,或直接在代码中写出本程序的完整路径。
  3. 在代码中调用 isInterleaved() 方法,传入三个字符串作为参数,即要检查的字符串及其可能组合的两个字符串。您也可以根据需求传入一个 caseSensitive 参数,以决定是否对字符串大小写敏感。若字符串可以由其他两个字符串或其排列组合而成,则返回 true,否则返回 false
示例代码

以下是示例代码:

import com.example.InterleavedStrings;

public class Main {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "def";
        String s3 = "adbecf";

        boolean result1 = InterleavedStrings.isInterleaved(s1, s2, s3, true);
        boolean result2 = InterleavedStrings.isInterleaved(s1, s2, s3, false);

        System.out.println("结果1(大小写敏感):" + result1);
        System.out.println("结果2(忽略大小写):" + result2);
    }
}

上述代码中,我们导入了名为 InterleavedStrings 的程序包,并分别调用了 isInterleaved 方法两次,输出了两种模式下的检查结果。