给定一个字符串 s
,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = "Let's take LeetCode contest" 输出:"s'teL ekat edoCteeL tsetnoc"
示例 2:
输入: s = "Mr Ding" 输出:"rM gniD"
提示:
1 <= s.length <= 5 * 104
s
包含可打印的 ASCII 字符。s
不包含任何开头或结尾空格。s
里 至少 有一个词。s
中的所有单词都用一个空格隔开。
思路:基本思路就是遍历字符串,遇到空格说明一个单词结束,然后把这个单词逆序放入result中,注意最后一个单词后面没有空格,需要在最后处理一下。
代码(Python):
class Solution(object):
def reverseWords(self, s):
result = '' #保存结果
t = '' #保存每一个单词
for i,word in enumerate(s):
if word != ' ':
t += word
else: #遇到空格,把单词逆序放入result
result += t[::-1]
result += ' ' #每个单词后面加个空格
t = ''
result += t[::-1] #处理最后一个单词
return result
在Python中有很多好用的函数可以很简便的解决这道题。
class Solution(object):
def reverseWords(self, s):
return ' '.join(s.split(' ')[::-1])[::-1]
解释一下这段代码:
输入:s = "Let's take LeetCode contest" 输出:"s'teL ekat edoCteeL tsetnoc"
首先执行的是括号内的s.split(' ')[::-1]
s.split(' ')就是按空格切分字符串,这一步执行完之后字符串中的一个个单词就被划分出来了,也就是[Let's take LeetCode contest]
然后s.split(' ')[::-1]进行逆序,此时是以每个单词为单位,所以是将一个单词作为整体进行逆序,变成了[contest LeetCode take Let's]
然后执行' '.join(s.split(' ')[::-1])就是将所有的单词用空格连接起来,所以这一步执行完之后又变成了一个字符串,内容是contest LeetCode take Let's
最后执行' '.join(s.split(' ')[::-1])[::-1],这个操作是执行一个逆序,此时是对一个字符串整体进行逆序的操作,所以是以每个字符为单位,也就实现了对这个字符串整体的逆序,变成了s'teL ekat edoCteeL tsetnoc。很巧妙的做法。