https://leetcode.com/problems/interleaving-string/
There are 3 changing variables in this but still 2D memoization is giving correct answer. Can any one explain why so?
2D memoization
int dp[101][101];
bool sol(string s1,string s2,string s3,int n1,int n2,int k)
{
if(n1<0)
{
string str=s2.substr(0,n2+1);
string str1=s3.substr(0,k+1);
return str==str1;
}
if(n2<0)
{
string str=s1.substr(0,n1+1);
string str1=s3.substr(0,k+1);
return str==str1;
}
if(dp[n1][n2]!=-1)
return dp[n1][n2];
if(s3[k]==s1[n1]&&sol(s1,s2,s3,n1-1,n2,k-1)||s3[k]==s2[n2]&&sol(s1,s2,s3,n1,n2-1,k-1))
{
return dp[n1][n2]=true;
}
else
{
return dp[n1][n2]=false;
}
}
bool isInterleave(string s1, string s2, string s3) {
memset(dp,-1,sizeof(dp));
if(s1.length()+s2.length()!=s3.length())
return false;
return sol(s1,s2,s3,s1.length()-1,s2.length()-1,s3.length()-1);
}
3D memoization
bool sol(string s1,string s2,string s3,int n1,int n2,int n3)
{
if(n3<0)
return true;
if(n1<0)
{
string str=s2.substr(0,n2+1);
string str1=s3.substr(0,n3+1);
return str==str1;
}
if(n2<0)
{
string str=s1.substr(0,n1+1);
string str1=s3.substr(0,n3+1);
return str==str1;
}
if(dp[n1][n2][n3]!=-1)
return dp[n1][n2][n3];
if(s1[n1]==s2[n2]&&s1[n1]==s3[n3])
{
return dp[n1][n2][n3]=sol(s1,s2,s3,n1-1,n2,n3-1)||sol(s1,s2,s3,n1,n2-1,n3-1);
}
else if(s1[n1]==s3[n3])
{
return dp[n1][n2][n3]=sol(s1,s2,s3,n1-1,n2,n3-1);
}
else if(s2[n2]==s3[n3])
{
return dp[n1][n2][n3]=sol(s1,s2,s3,n1,n2-1,n3-1);
}
else
{
return dp[n1][n2][n3]=false;
}
}