题目描述:
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = "the sky is blue
" 输出:"blue is sky the
"
示例 2:
输入:s = " hello world " 输出:"world hello" 解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = "a good example" 输出:"example good a" 解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
提示:
1 <= s.length <= 104
s
包含英文大小写字母、数字和空格' '
s
中 至少存在一个 单词
力扣链接:
思路分析:
这道题看上去非常简单,说实话我看到它的第一想法就是使用split()函数将字符串按空格拆分为单词列表,然后使用栈进行翻转处理,这是最容易想到的,但是如果这样做的话需要引入一个一个辅助空间-栈,这样的空间复杂度是O(n)。能不能不引入辅助空间来解决该题呢?
常规方法--内置函数解决:首先我们可以借助字符串本身的内置函数来进行处理。一开始调用strip()字符串内置函数来去除字符串首尾两侧存在的空格;然后使用[::-1]这个方法来实现整个字符串的反转;使用split()函数来分开字符串中的每个单词,然后反转每个单词,拼接反转后的单词。
双指针法:这个方法的用法非常广泛,出现频率非常高。在此,我们先采用split()方法进行单词切分。然后定义左指针和右指针,当left<right, 首尾值对调,完成之后指针进行加减变化。
代码分析:
# 常规方法
class Solution:
def reverseWords(self, s: str) -> str:
# 这个函数可以实现删除字符串前后空白
s = s.strip()
# 这个方法可以实现反转整个字符串。s[::-1]代表s[start:end:step=-1],即步长等于-1,那么表示从后到前进行切片
s = s[::-1]
# 将字符串拆分为单词,并反转每个单词
s = ' '.join(word[::-1] for word in s.split())
return s
# 使用双指针
class Solution:
def reverseWords(self, s:str) -> str:
# 将字符串拆分为单词, 即转换为列表类型
words = s.split()
# 反转单词
left, right = 0, len(words) - 1
while left < right:
words[left], words[right] = words[right], words[left]
left += 1
right -= 1
# 将列表转换为字符串
return " ".join(words)