题解 | #公共子串计算#

公共子串计算

https://www.nowcoder.com/practice/98dc82c094e043ccb7e0570e5342dd1b

方法一:循环遍历

方法二:动态规划

方法三:由于dp[i][j]在迭代时只与dp[i-1][j-1]有关,可在方法二的基础上对dp数组进行空间优化,用2xN的数组代替NxN的数组

import java.util.Scanner;

//3.动态规划-空间优化版
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s1 = sc.nextLine();
        String s2 = sc.nextLine();
        int[][] dp = new int[2][s2.length() + 1];
        int max = 0;
        for (int i = 1 ; i <= s1.length(); i++) {
            for (int j = 1 ; j <= s2.length(); j++) {
                if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
                    dp[1][j] = dp[0][j - 1] + 1;
                } else {
                    dp[1][j] = 0;
                }
                max = Math.max(max, dp[1][j]);
            }
            for (int j = 1 ; j <= s2.length(); j++) {
                dp[0][j] = dp[1][j];
            }
        }
        System.out.print(max);
    }
}

// //2.动态规划
// public class Main {
//     public static void main(String[] args) {
//         Scanner sc = new Scanner(System.in);
//         String s1 = sc.nextLine();
//         String s2 = sc.nextLine();
//         int[][] dp = new int[s1.length() + 1][s2.length() + 1];
//         int max = 0;
//         for (int i = 0 ; i <= s1.length(); i++) {
//             for (int j = 0 ; j <= s2.length(); j++) {
//                 if (i == 0 || j == 0) {
//                     dp[i][j] = 0;
//                 } else {
//                     if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
//                         dp[i][j] = dp[i - 1][j - 1] + 1;
//                     } else {
//                         dp[i][j] = 0;
//                     }
//                 }
//                 max = Math.max(max, dp[i][j]);
//             }
//         }
//         System.out.print(max);
//     }
// }

// //1.循环遍历
// public class Main {
//     public static void main(String[] args) {
//         Scanner sc = new Scanner(System.in);
//         String s1 = sc.nextLine();
//         String s2 = sc.nextLine();
//         if (s1.length() > s2.length()) {
//             String temp = s1;
//             s1 = s2;
//             s2 = temp;
//         }
//         int n = s1.length() + 1;
//         String resStr = "";
//         boolean flag = false;
//         while (!flag && --n > 0) {
//             for (int i = 0 ; i <= s1.length() - n; i++) {
//                 String str = s1.substring(i, i + n);
//                 if (s2.contains(str)) {
//                     resStr = str;
//                     flag = true;
//                 }
//             }
//         }
//         System.out.print(n);
//     }
// }
全部评论

相关推荐

头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
牛客771574427号:恭喜你,华杰
点赞 评论 收藏
分享
11-20 17:33
已编辑
门头沟学院 嵌入式工程师
小米汽车 底软测开岗 n*15(15大概率拿不到) 双非硕
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务