public boolean isInterleave(String s1, String s2, String s3) {
    int len1 = s1.length();
    int len2 = s2.length();
    int len3 = s3.length();
    
    
    if((len1+len2) != len3) return false;
    
    if(len1==0){
        if(s2.equals(s3))
            return true;
        else 
            return false;
    }
    if(len2==0){
        if(s1.equals(s3))
            return true;
        else 
            return false;
    }
    if(len3==0)
    {
        if(len1==0 && len2==0)
            return true;
        else 
            return false;
    }
    
    
    boolean dp[][] = new boolean[len1+1][len2+1];
    
    dp[0][0]= true;
    
    for(int i=1; i<=len1; i++){
        if(dp[i-1][0] && s3.charAt(i-1)==s1.charAt(i-1))
            dp[i][0]=true;
    }
    
    for(int i=1; i<=len2; i++){
        if(dp[0][i-1] && s3.charAt(i-1)==s2.charAt(i-1))
            dp[0][i]=true;
    }
    
    for(int i=1; i<=len1; i++)
        for(int j=1; j<=len2; j++){
            dp[i][j]=(dp[i-1][j]==true && s1.charAt(i-1)==s3.charAt(i+j-1))||(dp[i][j-1]==true && s2.charAt(j-1)==s3.charAt(i+j-1));
            
        }
    
    return dp[len1][len2];
}