##### Welcome to Subscribe On Youtube

Formatted question description: https://leetcode.ca/all/1451.html

# 1451. Rearrange Words in a Sentence

Medium

## Description

Given a sentence text (A sentence is a string of space-separated words) in the following format:

• First letter is in upper case.
• Each word in text are separated by a single space.

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

Return the new text following the format shown above.

Example 1:

Input: text = “Leetcode is cool”

Output: “Is cool leetcode”

Explanation: There are 3 words, “Leetcode” of length 8, “is” of length 2 and “cool” of length 4.

Output is ordered by length and the new first word starts with capital letter.

Example 2:

Input: text = “Keep calm and code on”

Output: “On and keep calm code”

Explanation: Output is ordered as follows:

“On” 2 letters.

“and” 3 letters.

“keep” 4 letters in case of tie order by position in original text.

“calm” 4 letters.

“code” 4 letters.

Example 3:

Input: text = “To be or not to be”

Output: “To be or to be not”

Constraints:

• text begins with a capital letter and then contains lowercase letters and single space between words.
• 1 <= text.length <= 10^5

## Solution

First, convert text to lower case letters. Next, split text into an array using spaces. Then sort array according to words’ lengths in ascending order.

After sorting, concatenate the words to form the new text, and convert the first letter in the new text to the upper case letter. Finally, return the new text.

• class Solution {
public String arrangeWords(String text) {
text = text.toLowerCase();
String[] array = text.split(" ");
Arrays.sort(array, new Comparator<String>() {
public int compare(String str1, String str2) {
return str1.length() - str2.length();
}
});
int length = array.length;
StringBuffer sb = new StringBuffer();
sb.append(array[0]);
sb.setCharAt(0, (char) (array[0].charAt(0) - ('a' - 'A')));
for (int i = 1; i < length; i++) {
sb.append(' ');
sb.append(array[i]);
}
return sb.toString();
}
}

• class Solution:
def arrangeWords(self, text: str) -> str:
words = text.split()
words[0] = words[0].lower()
words.sort(key=len)
words[0] = words[0].title()
return " ".join(words)


• class Solution {
public:
string arrangeWords(string text) {
vector<string> words;
stringstream ss(text);
string t;
while (ss >> t) {
words.push_back(t);
}
words[0][0] = tolower(words[0][0]);
stable_sort(words.begin(), words.end(), [](const string& a, const string& b) {
return a.size() < b.size();
});
string ans = "";
for (auto& s : words) {
ans += s + " ";
}
ans.pop_back();
ans[0] = toupper(ans[0]);
return ans;
}
};

• func arrangeWords(text string) string {
words := strings.Split(text, " ")
words[0] = strings.ToLower(words[0])
sort.SliceStable(words, func(i, j int) bool { return len(words[i]) < len(words[j]) })
words[0] = strings.Title(words[0])
return strings.Join(words, " ")
}

• function arrangeWords(text: string): string {
let words: string[] = text.split(' ');
words[0] = words[0].toLowerCase();
words.sort((a, b) => a.length - b.length);
words[0] = words[0].charAt(0).toUpperCase() + words[0].slice(1);
return words.join(' ');
}


• class Solution {
/**
* @param String $text * @return String */ function arrangeWords($text) {
$text = lcfirst($text);
$arr = explode(" ",$text);
for ($i = 0;$i < count($arr);$i++) {
$hashtable[$i] = strlen($arr[$i]);
}
asort($hashtable);$key = array_keys($hashtable);$rs = [];
for ($j = 0;$j < count($key);$j++) {
array_push($rs,$arr[$key[$j]]);
}
return ucfirst(implode(" ", \$rs));
}
}

• /**
* @param {string} text
* @return {string}
*/
var arrangeWords = function (text) {
let arr = text.split(' ');
arr[0] = arr[0].toLocaleLowerCase();
arr.sort((a, b) => a.length - b.length);
arr[0] = arr[0][0].toLocaleUpperCase() + arr[0].substr(1);
return arr.join(' ');
};