<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 {
public:
    string singledigitmult(string num1, char c) {
        string output = "";
        int n = num1.size();
        int carry = 0;
        
        for(int i = n-1; i >= 0; i--) {
            int val = (num1[i] - '0') * (c - '0') + carry;
            carry = val / 10;
            output.push_back(val % 10 + '0');
        }
        
        if(carry > 0) {
            output.push_back(carry + '0');
        }
        
        reverse(output.begin(), output.end());
        return output;
    }

    string multiply(string num1, string num2) {
        if(num1 == "0" || num2 == "0") {
            return "0";
        }
        
        vector<string> siglemultis;
        int n = num1.size(), m = num2.size();
        
        for(int i = m-1; i >= 0; i--) {
            string partialResult = singledigitmult(num1, num2[i]);
            partialResult.append(m - i - 1, '0');  // Add the required zeros at the end
            siglemultis.push_back(partialResult);
        }

        // Determine the maximum length of the partial results
        int maxlen = 0;
        for(auto &x : siglemultis) {
            maxlen = max(maxlen, (int)x.length());
        }
        
        vector<int> result(maxlen + 1, 0);
        
        // Sum up all the partial results
        for(auto &x : siglemultis) {
            int carry = 0;
            int resultIndex = maxlen;
            int xIndex = x.length() - 1;
            
            while(xIndex >= 0 || carry > 0) {
                int xDigit = (xIndex >= 0) ? (x[xIndex] - '0') : 0;
                int sum = result[resultIndex] + xDigit + carry;
                result[resultIndex] = sum % 10;
                carry = sum / 10;
                resultIndex--;
                xIndex--;
            }
        }

        // Convert result array to a string
        string ans = "";
        bool leadingZero = true;
        
        for(int i = 0; i < result.size(); i++) {
            if(leadingZero && result[i] == 0) {
                continue;
            }
            leadingZero = false;
            ans.push_back(result[i] + '0');
        }
        
        return ans.empty() ? "0" : ans;
    }
};

13303