1. 动态规划,迭代解法。非常基础的一个题目~
  2. dp[i][j]表示以a[i]和以b[j]结尾的最长子字符串的长度(属于带限定的原问题,或者说原问题的局部解)。
  3. 至于原问题的解,遍历所有的局部解从而求出最值即可。

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String a = in.nextLine();
        String b = in.nextLine();
        int[][] dp = new int[a.length()][b.length()];
        // dp[i][j]表示以a[i]和以b[j]结尾的最长子字符串的长度(属于带限定的原问题,或者说原问题的局部解)。
        // 至于原问题的解,就遍历所有的局部求出最值即可。
        int max = 0;
        for (int i = 0; i < a.length(); i++) {
            for (int j = 0; j < b.length(); j++) {
                if (a.charAt(i) != b.charAt(j)) {
                    //必然不可能从a和b中找到两个子字符串相等,因为a[i]!=b[j]
                    dp[i][j] = 0;
                } else {
                    if (i < 1 || j < 1) {
                        //边界处理
                        dp[i][j] = 1;
                    } else {
                        // 问题递归
                        dp[i][j] = dp[i - 1][j - 1] + 1;
                    }
                    //遍历所有局部的全部。
                    max = Math.max(dp[i][j], max);
                }
            }
        }
        System.out.println(max);
    }
}