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

《LeetCode每日一题 557: 反转字符串中的单词 III》 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;
}

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

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

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

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

    原文作者:FesonX
    原文地址: https://www.jianshu.com/p/812621cd9fc9
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞