Java获取两个字符串中最大相同子串

在日常的编程工作中,经常会遇到需要比较两个字符串中的相同部分的情况。本文将介绍如何使用Java来获取两个字符串中的最大相同子串。

什么是最大相同子串

最大相同子串是指两个字符串中完全相同的部分,且长度最长的子串。例如,对于字符串"ababc"和"babc",它们的最大相同子串为"babc"。

解决方案

1. 暴力法

最简单的方法是使用暴力法,即对于两个字符串的所有子串进行比较,找出它们的最大相同子串。这种方法的时间复杂度为O(n^3),不太适用于大规模的字符串。

public static String getMaxCommonSubstring(String str1, String str2) {
    String maxSub = "";
    for (int i = 0; i < str1.length(); i++) {
        for (int j = i + 1; j <= str1.length(); j++) {
            String sub = str1.substring(i, j);
            if (str2.contains(sub) && sub.length() > maxSub.length()) {
                maxSub = sub;
            }
        }
    }
    return maxSub;
}

2. 动态规划

动态规划是一种更高效的方法,它可以在O(n^2)的时间复杂度内找到最大相同子串。我们可以使用一个二维数组来记录两个字符串中每个位置的子串匹配情况。

public static String getMaxCommonSubstring(String str1, String str2) {
    int len1 = str1.length();
    int len2 = str2.length();
    int[][] dp = new int[len1 + 1][len2 + 1];
    int maxLen = 0;
    int endIndex = 0;
    for (int i = 1; i <= len1; i++) {
        for (int j = 1; j <= len2; j++) {
            if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
                if (dp[i][j] > maxLen) {
                    maxLen = dp[i][j];
                    endIndex = i - 1;
                }
            }
        }
    }
    return str1.substring(endIndex - maxLen + 1, endIndex + 1);
}

类图

使用mermaid语法绘制类图如下:

classDiagram
    class StringUtils {
        <<static>>
        + getMaxCommonSubstring(str1: String, str2: String): String
    }

流程图

使用mermaid语法绘制流程图如下:

flowchart TD
    A(开始)
    B{是否使用动态规划}
    C{获取最大相同子串}
    D(结束)
    
    A --> B
    B -- 是 --> C
    C --> D
    B -- 否 --> C
    C --> D

结论

通过本文的介绍,我们学习了如何使用Java获取两个字符串中的最大相同子串。在实际应用中,可以根据字符串的长度和需求选择合适的算法,以提高效率和准确性。希望本文对您有所帮助,谢谢阅读!