<p><strong>HTML entity parser</strong> is the parser that takes HTML code as input and replace all the entities of the special characters by the characters itself.</p>

<p>The special characters and their entities for HTML are:</p>

<ul>
	<li><strong>Quotation Mark:</strong> the entity is <code>&amp;quot;</code> and symbol character is <code>&quot;</code>.</li>
	<li><strong>Single Quote Mark:</strong> the entity is <code>&amp;apos;</code> and symbol character is <code>&#39;</code>.</li>
	<li><strong>Ampersand:</strong> the entity is <code>&amp;amp;</code> and symbol character is <code>&amp;</code>.</li>
	<li><strong>Greater Than Sign:</strong> the entity is <code>&amp;gt;</code> and symbol character is <code>&gt;</code>.</li>
	<li><strong>Less Than Sign:</strong> the entity is <code>&amp;lt;</code> and symbol character is <code>&lt;</code>.</li>
	<li><strong>Slash:</strong> the entity is <code>&amp;frasl;</code> and symbol character is <code>/</code>.</li>
</ul>

<p>Given the input <code>text</code> string to the HTML parser, you have to implement the entity parser.</p>

<p>Return <em>the text after replacing the entities by the special characters</em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> text = &quot;&amp;amp; is an HTML entity but &amp;ambassador; is not.&quot;
<strong>Output:</strong> &quot;&amp; is an HTML entity but &amp;ambassador; is not.&quot;
<strong>Explanation:</strong> The parser will replace the &amp;amp; entity by &amp;
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> text = &quot;and I quote: &amp;quot;...&amp;quot;&quot;
<strong>Output:</strong> &quot;and I quote: \&quot;...\&quot;&quot;
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= text.length &lt;= 10<sup>5</sup></code></li>
	<li>The string may contain any possible characters out of all the 256 ASCII characters.</li>
</ul>

class Solution {
public:
    string entityParser(string text)
    {
        unordered_map<string, char> *t;
        unordered_map<string, char>::iterator p;
        string tok, str;
        int i, j, k, l;
        
        t = new unordered_map<string, char>();
        t->insert({ "quot",  '\042' });
        t->insert({ "apos",  '\047' });
        t->insert({ "amp",   '&' });
        t->insert({ "gt",    '>' });
        t->insert({ "lt",    '<' });
        t->insert({ "frasl", '/' });
                   
        str = "";
        l = text.length();
        i = 0;
        while (i < l)
            if (text[i] == '&' &&
                (j = text.find(';', i + 1)) != string::npos) {
                tok = text.substr(i + 1, j - i - 1);
                if ((k = tok.find('&')) == string::npos) {
                    if ((p = t->find(tok)) != t->end())
                        str.push_back(p->second);
                    else
                        str += '&' + tok + ';';
                    i = j + 1;
                } else {
                    str.push_back('&');
                    if (k > 0)
                        str += tok.substr(0, k);
                    i += k + 1;
                }
            } else
                str.push_back(text[i++]);

        delete t;

        return str;
    }
};
22100