题解 | #公共子串计算#

最长公共子串,同 https://www.nowcoder.com/practice/181a1a71c7574266ad07f9739f791506 类似,只是此题只输出长度(上一题输出子串)
可以用动态规划,可以用双指针。
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.nextLine();
        String str2 = sc.nextLine();
        String minStr = str1.length() <= str2.length() ? str1 : str2;
        String maxStr = str1.length() > str2.length() ? str1 : str2;
        helper1(minStr, maxStr);
        helper2(minStr, maxStr);

    }

    /**
     * 最长公共子串问题,利用动态规划解决
     * dp[i][j]表示A以第i个字符结尾,B以第j个字符结尾,最长公共子串长度
     *     若A[i] == B[j],则dp[i][j] = dp[i-1][j-1];
     *     若A[i] != B[j],则dp[i][j] = 0;
     */
    public static void helper1(String minStr, String maxStr) {
        int[][] dp = new int[minStr.length()+1][maxStr.length()+1];
        int maxLen = 0;
        for (int i = 1; i <= minStr.length(); i++) {
            for (int j = 1; j <= maxStr.length(); j++) {
                if (minStr.charAt(i) == maxStr.charAt(j)) {
                    dp[i][j] = dp[i-1][j-1] + 1;
                    maxLen = Math.max(maxLen, dp[i][j]);
                } else {
                    dp[i][j] = 0;
                }
            }
        }
        System.out.println(maxLen);
    }

    public static void helper2(String minStr, String maxStr) {
        int result = 0;
        int left = 0, right = left + 1;
        while (right <= minStr.length()) {
            String tmp = minStr.substring(left, right);
            if (maxStr.contains(tmp)) {
                result = Math.max(result, tmp.length());
                right++;
            } else {
                left++;
                right = left + 1;
            }
        }
        System.out.println(result);

    }
}




全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务