<p>Given two non-negative integers <code>num1</code> and <code>num2</code> represented as strings, return the product of <code>num1</code> and <code>num2</code>, also represented as a string.</p>

<p><strong>Note:</strong>&nbsp;You must not use any built-in BigInteger library or convert the inputs to integer directly.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<pre><strong>Input:</strong> num1 = "2", num2 = "3"
<strong>Output:</strong> "6"
</pre><p><strong class="example">Example 2:</strong></p>
<pre><strong>Input:</strong> num1 = "123", num2 = "456"
<strong>Output:</strong> "56088"
</pre>
<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= num1.length, num2.length &lt;= 200</code></li>
	<li><code>num1</code> and <code>num2</code> consist of digits only.</li>
	<li>Both <code>num1</code> and <code>num2</code>&nbsp;do not contain any leading zero, except the number <code>0</code> itself.</li>
</ul>

class Solution {
private:
    int StoI(char s) {
        return (s - '0');
    }

    string addStrings(const string& n1, const string& n2) {
        int carry = 0;
        int i = n1.size() - 1, j = n2.size() - 1;
        stringstream result;
        
        while (i >= 0 || j >= 0 || carry) {
            int sum = carry;
            if (i >= 0) sum += StoI(n1[i--]);
            if (j >= 0) sum += StoI(n2[j--]);
            result << (sum % 10);
            carry = sum / 10;
        }
        
        string s = result.str();
        string rev_s(s.rbegin(), s.rend());
        return rev_s;
    }

public:
    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") return "0";
    
        string prod_prev = "0";
        int num2_len = num2.size();
        
        for (int i = num2_len - 1; i >= 0; --i) {
            int b = StoI(num2[i]);
            int carry = 0;
            stringstream prod_curr;
            
            for (int j = num1.size() - 1; j >= 0; --j) {
                int a = StoI(num1[j]);
                int prod = a * b + carry;
                prod_curr << (prod % 10);
                carry = prod / 10;
            }
            if (carry) prod_curr << carry;
            
            string curr = prod_curr.str();
            string rev_curr(curr.rbegin(), curr.rend());
            curr = rev_curr;
            curr.append(num2_len - 1 - i, '0');
            
            prod_prev = addStrings(prod_prev, curr);
        }

        return prod_prev;
    }
};
23491