package com.interview.dynamic;
/**
* http://en.wikipedia.org/wiki/Longest_common_substring_problem
*/
public class LongestCommonSubstring {
/**
* Dynamic way of calculating lcs
*/
public int longestCommonSubstring(char str1[], char str2[]){
int T[][] = new int[str1.length+1][str2.length+1];
int max = 0;
for(int i=1; i <= str1.length; i++){
for(int j=1; j <= str2.length; j++){
if(str1[i-1] == str2[j-1]){
T[i][j] = T[i-1][j-1] +1;
if(max < T[i][j]){
max = T[i][j];
}
}
}
}
return max;
}
/**
* Recursive way of calculating lcs
*/
public int longestCommonSubstringRec(char str1[], char str2[], int pos1, int pos2, boolean checkEqual){
if(pos1 == -1 || pos2 == -1){
return 0;
}
if(checkEqual){
if(str1[pos1] == str2[pos2]){
return 1 + longestCommonSubstringRec(str1, str2, pos1-1, pos2-1, true);
}else{
return 0;
}
}
int r1 = 0;
if(str1[pos1] == str2[pos2]){
r1 = 1 + longestCommonSubstringRec(str1, str2, pos1-1, pos2-1, true);
}
return Math.max(r1,Math.max(longestCommonSubstringRec(str1, str2, pos1-1, pos2, false), longestCommonSubstringRec(str1, str2, pos1, pos2-1,false)));
}
public static void main(String args[]){
LongestCommonSubstring lcs = new LongestCommonSubstring();
char str1[] = "abcdef".toCharArray();
char str2[] = "zcdemf".toCharArray();
System.out.println(lcs.longestCommonSubstring(str1, str2));
System.out.println(lcs.longestCommonSubstringRec(str1, str2,str1.length-1, str2.length-1,false));
}
}