题目地址:
https://www.lintcode.com/problem/longest-common-substring/description
给定两个字符串 A A A和 B B B,求其最长公共子串的长度。
思路是动态规划。设 f [ i ] [ j ] f[i][j] f[i][j]是以 A [ i ] A[i] A[i]和 B [ j ] B[j] B[j]结尾的最长公共子串的长度。则 f [ i ] [ j ] = { 1 + f [ i − 1 ] [ j − 1 ] , A [ i ] = B [ j ] 0 , A [ i ] ≠ B [ j ] f[i][j]=\begin{cases} 1+f[i-1][j-1],A[i]=B[j]\\ 0,A[i]\ne B[j] \end{cases} f[i][j]={1+f[i−1][j−1],A[i]=B[j]0,A[i]=B[j]递推的时候更新一下答案即可。代码如下:
public class Solution {
/**
* @param A: A string
* @param B: A string
* @return: the length of the longest common substring.
*/
public int longestCommonSubstring(String A, String B) {
// write your code here
int res = 0;
int[][] dp = new int[A.length()][B.length()];
for (int i = 0; i < A.length(); i++) {
for (int j = 0; j < B.length(); j++) {
if (A.charAt(i) == B.charAt(j)) {
if (i >= 1 && j >= 1) {
dp[i][j] = 1 + dp[i - 1][j - 1];
} else {
dp[i][j] = 1;
}
}
// 更新答案
res = Math.max(res, dp[i][j]);
}
}
return res;
}
}
时空复杂度 O ( m n ) O(mn) O(mn)。