import java.util.*;


public class Solution {
   /**
     * 寻找两个字符串的最长公共子串(Longest Common Substring)
     * 使用动态规划方法解决
     *
     * @param str1 第一个字符串
     * @param str2 第二个字符串
     * @return 返回两个字符串的最长公共子串,如果没有则返回null
     */
    public String LCS(String str1, String str2) {
        // 检查输入参数是否有效
        if (str1 == null || str2 == null || str1.length() == 0 || str2.length() == 0) {
            return null;
        }

        // 获取两个字符串的长度
        int m = str1.length();
        int n = str2.length();

        // 创建动态规划表,dp[i][j]表示str1的前i个字符和str2的前j个字符的最长公共子串
        String[][] dp = new String[m + 1][n + 1];
        String ans = ""; // 用于存储最终结果
        // 初始化动态规划表的第一列
        for (int i = 0; i <= m; i++) {
            dp[i][0] = "";
        }

        // 初始化动态规划表的第一行
        for (int j = 0; j <= n; j++) {
            dp[0][j] = "";
        }

        // 填充动态规划表
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                // 如果当前字符匹配,则将公共子串延长
                if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1] + str1.charAt(i - 1);

                } else {
                    // 如果当前字符不匹配,则公共子串为空
                    dp[i][j] = "";
                }
                // 更新最长公共子串
                String tempString = dp[i][j];
                ans = ans.length() > tempString.length() ? ans : tempString;
            }
        }

        // 返回结果,如果长度为0则返回null
        return ans.length() > 0 ? ans : null;

    }
}