原文链接: https://leetcode-cn.com/problems/reverse-words-in-a-string-iii
英文原文
Given a string s
, reverse the order of characters in each word within a sentence while still preserving whitespace and initial word order.
Example 1:
Input: s = "Let's take LeetCode contest" Output: "s'teL ekat edoCteeL tsetnoc"
Example 2:
Input: s = "God Ding" Output: "doG gniD"
Constraints:
1 <= s.length <= 5 * 104
s
contains printable ASCII characters.s
does not contain any leading or trailing spaces.- There is at least one word in
s
. - All the words in
s
are separated by a single space.
中文题目
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例:
输入:"Let's take LeetCode contest" 输出:"s'teL ekat edoCteeL tsetnoc"
提示:
- 在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
通过代码
高赞题解
解题思路
因为在 Python
中字符串是不可变,因此遍历字符串交换每个单词内字符位置的方法不太可行,但是利用 Python
切片的便利,可以写出更优雅的实现方式。
1、常规思路
将字符串分割成单词列表 然后把每个单词反转切片
代码
class Solution(object):
def reverseWords(self, s):
return " ".join(word[::-1] for word in s.split(" "))
分析
- 时间复杂度: $O(n)$ 。其中 $n$ 是字符串的长度。
- 空间复杂度: $O(1)$ 。
2、利用两次切片,不需遍历
先反转单词列表 再反转字符串
以字符串
“I love drag queen”
为例:
s.split(“ “) 将字符串分割成单词列表:
['I', 'love', 'drag', 'queen']
s.split(“ “)[::-1] 将单词列表反转:
['queen', 'drag', 'love', 'I']
“ “.join(s.split(“ “)[::-1]) 将单词列表转换为字符串,以空格分隔:
"queen drag love I"
“ “.join(s.split(“ “)[::-1])[::-1] 将字符串反转:
”I evol gard neeuq“
代码
class Solution(object):
def reverseWords(self, s):
return " ".join(s.split(" ")[::-1])[::-1]
分析
- 时间复杂度: $O(n)$ 。其中 $n$ 是字符串的长度。
- 空间复杂度: $O(1)$ 。
或者,
3、先反转字符串,再反转单词列表
s[::-1] 反转字符串:
“neeuq gard evol I”
s[::-1].split(“ “) 将字符串分割成单词列表:
['neeuq', 'gard', 'evol', 'I']
s[::-1].split(“ “)[::-1] 将单词列表反转:
['I', 'evol', 'gard', 'neeuq']
“ “.join(s[::-1].split(“ “)[::-1]) 将单词列表转换为字符串,以空格分隔:
“I evol gard neeuq”
代码
class Solution(object):
def reverseWords(self, s):
return " ".join(s[::-1].split(" ")[::-1])
分析
- 时间复杂度:$O(n)$。其中 $n$ 是字符串的长度。
- 空间复杂度:$O(1)$。
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
179604 | 241513 | 74.4% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|
相似题目
题目 | 难度 |
---|---|
反转字符串 II | 简单 |