LeetCode每日一题 557: 反转字符串中的单词 III

5530017-6ea1a26c77950807.png

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;
}

5530017-eaa4c00d401f0136.png

结果

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])

5530017-7ec58b44f8282656.png

结果


微信公众号: 程序员的碎碎念

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值