<p>Given a <code>date</code> string in the form&nbsp;<code>Day Month Year</code>, where:</p>

<ul>
	<li><code>Day</code>&nbsp;is in the set <code>{&quot;1st&quot;, &quot;2nd&quot;, &quot;3rd&quot;, &quot;4th&quot;, ..., &quot;30th&quot;, &quot;31st&quot;}</code>.</li>
	<li><code>Month</code>&nbsp;is in the set <code>{&quot;Jan&quot;, &quot;Feb&quot;, &quot;Mar&quot;, &quot;Apr&quot;, &quot;May&quot;, &quot;Jun&quot;, &quot;Jul&quot;, &quot;Aug&quot;, &quot;Sep&quot;, &quot;Oct&quot;, &quot;Nov&quot;, &quot;Dec&quot;}</code>.</li>
	<li><code>Year</code>&nbsp;is in the range <code>[1900, 2100]</code>.</li>
</ul>

<p>Convert the date string to the format <code>YYYY-MM-DD</code>, where:</p>

<ul>
	<li><code>YYYY</code> denotes the 4 digit year.</li>
	<li><code>MM</code> denotes the 2 digit month.</li>
	<li><code>DD</code> denotes the 2 digit day.</li>
</ul>

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

<pre>
<strong>Input:</strong> date = &quot;20th Oct 2052&quot;
<strong>Output:</strong> &quot;2052-10-20&quot;
</pre>

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

<pre>
<strong>Input:</strong> date = &quot;6th Jun 1933&quot;
<strong>Output:</strong> &quot;1933-06-06&quot;
</pre>

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

<pre>
<strong>Input:</strong> date = &quot;26th May 1960&quot;
<strong>Output:</strong> &quot;1960-05-26&quot;
</pre>

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

<ul>
	<li>The given dates are guaranteed to be valid, so no error handling is necessary.</li>
</ul>

class Solution {
public:
    string reformatDate(string date) {
        stringstream ss;

        unordered_map<string, int> monthMap;
        fillMonthMap(monthMap);

        int daySpaceIndex = date.find(' ');
        int monthSpaceIndex = date.find(' ', daySpaceIndex + 1);

        string day = date.substr(0, daySpaceIndex);
        string month = to_string(monthMap[date.substr(daySpaceIndex + 1, monthSpaceIndex - daySpaceIndex - 1)]);
        string year = date.substr(monthSpaceIndex + 1, date.size() - monthSpaceIndex);

        int nonNumericCharIndex = 0;

        while(day[nonNumericCharIndex] >= '0' && day[nonNumericCharIndex] <= '9') {
            nonNumericCharIndex++;
        }

        day = day.substr(0, nonNumericCharIndex);

        if(day.size() == 1) {
            day = "0" + day;
        }

        if(month.size() == 1) {
            month = "0" + month;
        }

        ss << year << "-" << month << "-" << day;

        return ss.str();
    }

    void fillMonthMap(unordered_map<string, int>& monthMap) {
        monthMap["Jan"] = 1;
        monthMap["Feb"] = 2;
        monthMap["Mar"] = 3;
        monthMap["Apr"] = 4;
        monthMap["May"] = 5;
        monthMap["Jun"] = 6;
        monthMap["Jul"] = 7;
        monthMap["Aug"] = 8;
        monthMap["Sep"] = 9;
        monthMap["Oct"] = 10;
        monthMap["Nov"] = 11;
        monthMap["Dec"] = 12;
    }
};
8500