原题链接在这里:http://www.lintcode.com/en/problem/longest-common-substring/#

题目:

Given two strings, find the longest common substring.

Return the length of it.

The characters in substring should occur continuously in original string. This is different with subsequence.
Example

Given A = "ABCD", B = "CBCE", return 2. "BC"

Challenge

O(n x m) time and memory.

题解:

Longest Common Subsequence相似.

DP. 参考http://www.geeksforgeeks.org/longest-common-substring/

dp[i][j]表示长度为i的str1 和 长度为j的str2 longest common substring长度.

看两个substring 的 suffix.

dp[i][j] = dp[i-1][j-1] + 1 if str1.charAt(i-1) == str2.charAt(j-1).

dp[i][j] = 0. o.w

Time Complexity: O(m*n). Space: O(m*n).

AC Java:

 1 public class Solution {
 2     /**
 3      * @param A, B: Two string.
 4      * @return: the length of the longest common substring.
 5      */
 6     public int longestCommonSubstring(String A, String B) {
 7         if(A == null || B == null){
 8             return 0;
 9         }
10         int m = A.length(); 
11         int n = B.length();
12         int [][] dp = new int[m+1][n+1];
13         int longest = 0;
14         for(int i = 1; i<=m; i++){
15             for(int j = 1; j<=n; j++){
16                 if(A.charAt(i-1) == B.charAt(j-1)){
17                     dp[i][j] = dp[i-1][j-1]+1;
18                 }else{
19                     dp[i][j] = 0;
20                 }
21                 longest = Math.max(longest, dp[i][j]);
22             }
23         }
24         return longest;
25     }
26 }