151. Reverse Words in a String

Given an input string, reverse the string word by word.

Example 1:

Input: "the sky is blue"
Output: "blue is sky the"

Example 2:

Input: "  hello world!  "
Output: "world! hello"
Explanation: Your reversed string should not contain leading or trailing spaces.

Example 3:

Input: "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.

Note:

  • A word is defined as a sequence of non-space characters.

  • Input string may contain leading or trailing spaces. However, your reversed string should not contain leading or trailing spaces.

  • You need to reduce multiple spaces between two words to a single space in the reversed string.

Follow up:

For C programmers, try to solve it in-place in O(1) extra space.

string reverseWords(string s) { // time: O(n); space: O(n)
    istringstream iss(s);
    string buff, res;
    iss >> res;
    while (iss >> buff) {
        res = buff + ' ' +  res;
    }
    if (!res.empty() && res[0] == ' ') res.clear(); // handle corner case such as s = " "
    return res;
}
string reverseWords(string s) { // time: O(n); space: O(n)
    string res;
    int n = s.length();
    for (int i = 0; i < n; ++i) {
        if (s[i] == ' ') continue;
        int word_start = i;
        while (i < n && s[i] != ' ') {
            ++i;
        }
        // add space if res is not empty
        if (!res.empty()) {
            res = ' ' + res;
        }
        res = s.substr(word_start, i - word_start) + res;
    }
    return res;
}
// In-Place Algorithm
string reverseWords(string s) { // time: O(n); space: O(1)
    reverse(s.begin(), s.end());
    int n = s.length(), storeIdx = 0;
    for (int i = 0; i < n; ++i) {
        if (s[i] == ' ') continue;
        // add space if res is not empty
        if (storeIdx > 0) s[storeIdx++] = ' ';
        int j = i;
        while (j < n && s[j] != ' ') {
            s[storeIdx++] = s[j++];
        }
        reverse(s.begin() + storeIdx - (j - i), s.begin() + storeIdx);
        i = j;
    }
    s.resize(storeIdx);
    return s;
}
186. Reverse Words in a String II

Last updated

Was this helpful?