采用动态规划的思想。
使用二维数组,每个元素dp[i][j]表示以 A[i-1] B[j - 1]结尾的最大公共子串
import java.util.Scanner;
/**
* Created by zfr on 2018/08/02.
* 最长公共子串问题
*/
public class LCS{
public static void main(String[] args) {
// TODO Auto-generated method stub
LCS a = new LCS();
Scanner scanner = new Scanner(System.in);
String A = scanner.nextLine();
String B = scanner.nextLine();
String res = a.cal(A,B);
System.out.println(res);
}
///最长公共子串 -- 动态规划
//时间复杂度O(mn) 空间复杂度O(mn)
public String cal(String A ,String B){
int max = 0;//最长公共子串的长度
int index = 0;//最长公共子串的最后一个索引值
int lenA = A.length();
int lenB = B.length();
char[] chA = A.toCharArray();
char[] chB = B.toCharArray();
//dp[i][j] 表示以 A[i-1] 和 B[j-1]结尾的最长公共子串
int[][] dp = new int[lenA+1][lenB+1];
for(int i = 0;i < lenA; i++){
for(int j = 0; j<lenB ;j++){
if(chA[i]==chB[j]){
dp[i+1][j+1] = Math.max(dp[i+1][j+1],1+dp[i][j]);
if(dp[i+1][j+1] > max ){
max = dp[i+1][j+1];
index = i+1;
}
}
}
}
return A.substring(index - max,index);
}
}
输入:
helloEverybodyhiwhat
what
输出:
what
上述的时间空间复杂度均为O(mn)
在LEETCODE上看到一种解决方案时间复杂度为O(mn),空间复杂度为O(1)。
https://leetcode.com/problems/maximum-length-of-repeated-subarray/discuss/109040/java-omn-time-o1-space