题目

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

示例 1:

输入: “Let’s take LeetCode contest”
输出: “s’teL ekat edoCteeL tsetnoc”
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

来源:https://leetcode-cn.com/problems/reverse-words-in-a-string-iii

解题思路

因为在 Python 中字符串是不可变,因此遍历字符串交换每个单词内字符位置的方法不太可行,但是利用 Python 切片的便利,可以写出更优雅的实现方式。

1、常规思路

将字符串分割成单词列表 然后把每个单词反转切片

代码
1
2
3
class Solution(object):
    def reverseWords(self, s):
        return " ".join(word[::-1for word in s.split(" "))
分析
  • 时间复杂度: O(n) 。其中 n 是字符串的长度。
  • 空间复杂度: O(1) 。

2、利用两次切片,不需遍历

先反转单词列表 再反转字符串

以字符串 “I love drag queen” 为例:

s.split(“ “) 将字符串分割成单词列表:

1
['I', 'love', 'drag', 'queen']

s.split(“ “)[::-1] 将单词列表反转:

1
['queen', 'drag', 'love', 'I']

“ “.join(s.split(“ “)[::-1]) 将单词列表转换为字符串,以空格分隔:

1
"queen drag love I"

“ “.join(s.split(“ “)[::-1])[::-1] 将字符串反转:

1
I evol gard neeuq“

代码
1
2
3
class Solution(object):
    def reverseWords(self, s):
        return " ".join(s.split(" ")[::-1])[::-1]
分析
  • 时间复杂度: O(n) 。其中 n 是字符串的长度。
  • 空间复杂度: O(1) 。

或者,

3、先反转字符串,再反转单词列表

s[::-1] 反转字符串:

1
“neeuq gard evol I

s[::-1].split(“ “) 将字符串分割成单词列表:

1
['neeuq', 'gard', 'evol', 'I']

s[::-1].split(“ “)[::-1] 将单词列表反转:

1
['I', 'evol', 'gard', 'neeuq']

“ “.join(s[::-1].split(“ “)[::-1]) 将单词列表转换为字符串,以空格分隔:

1
I evol gard neeuq”

代码
1
2
3
class Solution(object):
    def reverseWords(self, s):
         return " ".join(s[::-1].split(" ")[::-1])
分析
  • 时间复杂度:O(n)。其中 n 是字符串的长度。
  • 空间复杂度:O(1)。