public class Solution {
    public String LCS(String str1, String str2) {
        if (str1 == null || str2 == null || str1.length() == 0 || str2.length() == 0) {
            return "-1";
        }

        int m = str1.length();
        int n = str2.length();

        int[][] dp = new int[m + 1][n + 1];

        int maxLength = 0;   // 记录最长连续子串的长度
        int maxEndIndex = 0; // 记录最长子串在 str1 中的结束位置

        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] + 1;

                    if (dp[i][j] > maxLength) {
                        maxLength = dp[i][j]; // 更新最高分
                        maxEndIndex = i;      // 记下这是 str1 的第几个字母
                    }
                } else {
                    dp[i][j] = 0;
                }
            }
        }

        if (maxLength == 0) {
            return "-1";
        }

        // substring 的用法是:从 (结束位置 - 长度) 开始截取,一直到结束位置
        return str1.substring(maxEndIndex - maxLength, maxEndIndex);
    }
}