package com.interview.dynamic;
/**
*
* http://www.geeksforgeeks.org/check-whether-a-given-string-is-an-interleaving-of-two-other-given-strings-set-2/
*/
public class TwoStringInterleavingToFormThird {
public boolean isInterleavedRecursive(char str1[], char str2[], char str3[],int pos1, int pos2, int pos3){
if(pos1 == str1.length && pos2 == str2.length && pos3 == str3.length){
return true;
}
if(pos3 == str3.length){
return false;
}
return (pos1 < str1.length && str1[pos1] == str3[pos3] && isInterleavedRecursive(str1, str2, str3, pos1+1, pos2, pos3+1))
|| (pos2 < str2.length && str2[pos2] == str3[pos3] && isInterleavedRecursive(str1, str2, str3, pos1, pos2+1, pos3+1));
}
public boolean isInterleaved(char str1[], char str2[], char str3[]){
boolean T[][] = new boolean[str1.length +1][str2.length +1];
if(str1.length + str2.length != str3.length){
return false;
}
for(int i=0; i < T.length; i++){
for(int j=0; j < T[i].length; j++){
int l = i + j -1;
if(i == 0 && j == 0){
T[i][j] = true;
}
else if(i == 0){
if(str3[l] == str2[j-1]){
T[i][j] = T[i][j-1];
}
}
else if(j == 0){
if(str1[i-1] == str3[l]){
T[i][j] = T[i-1][j];
}
}
else{
T[i][j] = (str1[i-1] == str3[l] ? T[i-1][j] : false) || (str2[j-1] == str3[l] ? T[i][j-1] : false);
}
}
}
return T[str1.length][str2.length];
}
public static void main(String args[]){
String str1 = "XXYM";
String str2 = "XXZT";
String str3 = "XXXZXYTM";
TwoStringInterleavingToFormThird sti = new TwoStringInterleavingToFormThird();
System.out.println(sti.isInterleaved(str1.toCharArray(), str2.toCharArray(), str3.toCharArray()));
}
}