# LC 151. Reverse Words in a String ### [Problem link](https://leetcode.com/problems/reverse-words-in-a-string/) ###### tags: `leedcode` `medium` `python` `c++` Given an input string <code>s</code>, reverse the order of the **words** . A **word** is defined as a sequence of non-space characters. The **words** in <code>s</code> will be separated by at least one space. Return a string of the words in reverse order concatenated by a single space. **Note** that <code>s</code> may contain leading or trailing spaces or multiple spaces between two words. The returned string should only have a single space separating the words. Do not include any extra spaces. **Example 1:** ``` Input: s = "the sky is blue" Output: "blue is sky the" ``` **Example 2:** ``` Input: s = " hello world " Output: "world hello" Explanation: Your reversed string should not contain leading or trailing spaces. ``` **Example 3:** ``` Input: s = "a good example" Output: "example good a" Explanation: You need to reduce multiple spaces between two words to a single space in the reversed string. ``` **Constraints:** - <code>1 <= s.length <= 10<sup>4</sup></code> - <code>s</code> contains English letters (upper-case and lower-case), digits, and spaces <code>' '</code>. - There is **at least one** word in <code>s</code>. **Follow-up:** If the string data type is mutable in your language, canyou solve it **in-place** with `O(1)` extra space? ## Solution 1 #### Python ```python= # Mar 23, 2023 class Solution: def reverseWords(self, s: str) -> str: s_list = [i for i in s.split(" ") if len(i) > 0] return " ".join(s_list[::-1]) ``` #### C++ ```cpp= // Nov 20, 2023 class Solution { public: void trim(string &s) { int left = 0; for (int i = 0; i < s.size(); i++) { if (s[i] != ' ') { if (left != 0) { s[left++] = ' '; } while (i < s.size() && s[i] != ' ') { s[left++] = s[i++]; } } } s.resize(left); } string reverseWords(string s) { trim(s); reverse(s.begin(), s.end()); int idx = 0; for (int i = 0; i < s.size(); i++) { if (s[i] == ' ') { reverse(s.begin() + idx, s.begin() + i); idx = i + 1; } } reverse(s.begin() + idx, s.end()); return s; } }; ``` >### Complexity >| | Time Complexity | Space Complexity | >| ------------------- | --------------- | ---------------- | >| Solution 1(c++) | O(n) | O(1) | >| Solution 1(python) | O(n) | O(n) | ## Note [reference](https://github.com/youngyangyang04/leetcode-master/blob/master/problems/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.md) c++的std::reverse是左閉右開的形式. trim: " the sky is blue " => "the sky is blue" reverse: "the sky is blue" => "eulb si yks eht" code最後一段: "eulb si yks eht" => "blue is sky the"