<p>Given a sentence&nbsp;<code>text</code> (A&nbsp;<em>sentence</em>&nbsp;is a string of space-separated words) in the following format:</p>

<ul>
	<li>First letter is in upper case.</li>
	<li>Each word in <code>text</code> are separated by a single space.</li>
</ul>

<p>Your task is to rearrange the words in text such that&nbsp;all words are rearranged in an increasing order of their lengths. If two words have the same length, arrange them in their original order.</p>

<p>Return the new text&nbsp;following the format shown above.</p>

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

<pre>
<strong>Input:</strong> text = &quot;Leetcode is cool&quot;
<strong>Output:</strong> &quot;Is cool leetcode&quot;
<strong>Explanation: </strong>There are 3 words, &quot;Leetcode&quot; of length 8, &quot;is&quot; of length 2 and &quot;cool&quot; of length 4.
Output is ordered by length and the new first word starts with capital letter.
</pre>

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

<pre>
<strong>Input:</strong> text = &quot;Keep calm and code on&quot;
<strong>Output:</strong> &quot;On and keep calm code&quot;
<strong>Explanation: </strong>Output is ordered as follows:
&quot;On&quot; 2 letters.
&quot;and&quot; 3 letters.
&quot;keep&quot; 4 letters in case of tie order by position in original text.
&quot;calm&quot; 4 letters.
&quot;code&quot; 4 letters.
</pre>

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

<pre>
<strong>Input:</strong> text = &quot;To be or not to be&quot;
<strong>Output:</strong> &quot;To be or to be not&quot;
</pre>

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

<ul>
	<li><code>text</code> begins with a capital letter and then contains lowercase letters and single space between words.</li>
	<li><code>1 &lt;= text.length &lt;= 10^5</code></li>
</ul>


class Solution {
public:
    static bool compare(pair<string, int> pair1, pair<string, int> pair2) {
        if (pair1.first.size() == pair2.first.size()) {
            return pair1.second < pair2.second;
        }
        return pair1.first.size() < pair2.first.size();
    }
    string arrangeWords(string text) {
        //split the string;
        //loop through each string to find the indices of each word
        //(string ,int):
        string word; 
        stringstream stream(text);
        vector<pair<string, int>> words;
        int i = 0;
        while(std::getline(stream, word, ' ')){
            words.push_back(make_pair(word, i));
            i++;
        }
        sort(words.begin(), words.end(), compare);
        string string = "";
        for (int i = 0; i < words.size(); i++) {
            //std::cout << words[i].first << std::endl;
            
            if (i == 0) {
                string += toupper(words[i].first.at(0));
                if (words[i].first.size() > 1) {
                    string += words[i].first.substr(1);
                }
            } else {
                
                string += " ";
                if (isupper(words[i].first.at(0))) {
                    string += tolower(words[i].first.at(0));
                    if (words[i].first.size() > 1) {
                        string += words[i].first.substr(1);   
                    }
                } else {
                    string += words[i].first.substr(0);   
                }
            }
        }
        return string;
    }
};
23000