这个题目是当时远景能源公司现场笔试的一道题目,当时根本就不知道动态规划是什么鬼,直接上来就暴力求解,面试官很谄媚的问我,你这能求出来吗?当时很年轻的说,能啊!如今想,当时哪来的自信和逗比勇气说这大话。。。在《进军硅谷》这本书上看到原题,我是懵逼,怎么想出这种解答出来的,下面直接上思路和代码。面试
定义二维数组dp[i][j]记录最大公共子串的长度,算法
有点相似于数学概括法数组
1 public static String maxCommonString(String s1, String s2) { 2 String res = ""; 3 if (s1 == null || s1.length() == 0 || s2 == null || s2.length() == 0) 4 return res; 5 int max = 0, m = s1.length(), n = s2.length(); 6 int[][] dp = new int[m][n]; // 定义一个二维数组记录最大公共子串的长度 7 // 计算到s1的第i个字符和s2的第j个字符为止的最大公共子串长度 8 for (int i = 0; i < m; i++) { 9 for (int j = 0; j < n; j++) { 10 // 若是s1字符串在i处和s2字符串在j处有字符相同,进入if代码块中 11 if (s1.charAt(i) == s2.charAt(j)) { 12 if (i == 0 || j == 0) 13 dp[i][j] = 1;// 边界的状况 14 else 15 dp[i][j] = dp[i - 1][j - 1] + 1;// 加上当前长度 16 // 记录最大长度和子串 17 if (dp[i][j] > max) { 18 max = dp[i][j]; 19 res = s1.substring(i - dp[i][j] + 1, i + 1);// substring()左闭右开 20 } 21 } 22 } 23 } 24 return res; 25 }
动态规划介绍markdown
动态规划算法通常是基于一个递推公式(如上面的当s[i]==s[j]时,dp[i][j]=dp[i-1][j-1]+1;)以及一个或多个初始状态(当s[i]!=s[j]时,dp[i][j]=0;),当前子问题实际上是由上一次子问题的解推算出来的。
【附带福利:markdown每行缩进的方式】spa
半方的空白&ensp;或 ;
全方的空白&emsp;或 ;
不断行的空白格 ;或 ;
(分号都是英文格式的)code