leetcode.png
题目
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
分析
不同于之前的反转字符串I, 这道题反转的是一个句子或多个单词的短语, 并且不是原地反转
在 C 的实现中, 原先的原地解法仍可保留, 不过在此基础上, 添加一个检测单词的功能, 再调用此前的解法逐一对单词进行反转即可.
在 Python 实现中, 传入的也不再是字符数组, 而是一个字符串. 字符串在 Python 中是不可变的类型, 之前那道题的写法在这里就不能直接用了.
实现
C语言
char* reverse(char* s, int from, int to);
char* reverseWords(char* s) {
int from = 0, to = 0;
while(s[to] != '\0'){
if(s[to] != ' ')
to++;
else{
reverse(s, from, to-1);
from = ++to;
}
}
reverse(s, from, to-1);
return s;
}
char* reverse(char* s, int from, int to){
while(from < to){
char temp = s[from];
s[from++] = s[to];
s[to--] = temp;
}
return s;
}
结果
Python
在Python的实现中, 我没有采用上方C的解法, 原因是传入和返回的均非字符串数组, 若采用原地反转需要先转数组(单词), 再转回字符串(单词), 再拼接字符串数组(句子), 最后转回字符串返回(句子).
整个过程过于繁琐, 这里直接用 Python 的数组自带的方法, 对整个字符串做两次翻转实现反转字符串.
第一次整体反转, 整个字符串逆序.(s[::-1]
)
第二次单词次序反转, 对反转字符串分割为单词列表(s[::-1].split()
), 对单词次序反转(s[::-1].split()[::-1]
).
class Solution:
def reverseWords(self, s):
"""
:type s: str
:rtype: str
"""
return ' '.join(s[::-1].split()[::-1])
结果
微信公众号: 程序员的碎碎念