🥉Easy

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例
/

  1. 输入:"Let's take LeetCode contest"
  2. 输出:"s'teL ekat edoCteeL tsetnoc"


提示

在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

题解

使用额外空间

此题比较简单,就是遍历整个字符串,找到一个单词,再将这个单词翻转,最后将所有单词拼成字符串就行。这样就使用了新的空间。所以时间复杂度和空间复杂度都是🥉557. 反转字符串中的单词 III - 图1

Python

  1. class Solution:
  2. def reverseWords(self, s: str) -> str:
  3. ans = []
  4. temp = []
  5. for i in s:
  6. if i != ' ':
  7. temp.append(i)
  8. else:
  9. temp.reverse()
  10. temp = ''.join(temp)
  11. ans.append(temp)
  12. ans.append(' ')
  13. temp = []
  14. if temp:
  15. temp.reverse()
  16. temp = ''.join(temp)
  17. ans.append(temp)
  18. return ''.join(ans)

还有比上面更简洁的写法:

def reverseWords1(self, s: str) -> str:
        res = ''
        N = len(s)
        i = 0
        while i < N:
            j = i
            while i < N and s[i] != ' ':
                i += 1
            res += ''.join(s[j:i][::-1])
            i += 1
            res += ' '
        return res[:-1]

    def reverseWords2(self, s: str) -> str:
        ss = s.split(' ')
        res = ''
        for c in ss:
            res += ''.join(c[::-1])
            res += ' '
        # drop the last
        return res[:-1]

JavaScript

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    let ans = []
    let temp = []
    for (let i of s) {
        if (i !== ' '){
            temp.push(i)
        } else {
            temp.reverse()
            temp=temp.join('')
            ans.push(temp)
            ans.push(' ')
            temp=[]
        }
    }
    if (temp) {
        temp.reverse()
        temp=temp.join('')
        ans.push(temp)
        temp=[]
    }
    return ans.join('')

};

不使用额外空间(原地算法)

和上面方法比较类似,就是找到一个单词之后,直接首尾交换即可。但是要注意:

原地算法在某些语言(比如 Java,python,JavaScript)中不适用,因为在这些语言中 String 类型是一个不可变的类型。

C++

class Solution {
public: 
    string reverseWords(string s) {
        int length = s.length();
        int i = 0;
        while (i < length) {
            int start = i;
            while (i < length && s[i] != ' ') {
                i++;
            }

            int left = start, right = i - 1;
            while (left < right) {
                swap(s[left], s[right]);
                left++;
                right--;
            }
            while (i < length && s[i] == ' ') {
                i++;
            }
        }
        return s;
    }
};