leetcode:186.翻转字符串里的单词 II

题目来源

题目描述

给定一个字符串,逐个翻转字符串中的每个单词。

示例:
输入:[“t”,“h”,“e”," “,“s”,“k”,“y”,” “,“i”,“s”,” “,“b”,“l”,“u”,“e”]
输出:[“b”,“l”,“u”,“e”,” “,“i”,“s”,” “,“s”,“k”,“y”,” ",“t”,“h”,“e”]

注意:

  • 单词的定义是不包含空格的一系列字符
  • 输入字符串中不会包含前置或尾随的空格
  • 单词与单词之间永远是以单个空格隔开的

进阶:使用 O(1) 额外空间复杂度的原地解法。

class Solution {
public:
    void reverseWords(vector<char>& str){
        
    }
};

题目解析

思路

  • 先把每个单词翻转一遍,再把整个字符串翻转一遍,或者也可以调换个顺序,先翻转整个字符串,再翻转每个单词
class Solution {
    static void reverse(vector<char>& str, int left, int right){
        while (left < right){
            std::swap(str[left], str[right]);
            left++; right--;
        }
    }
public:
    void reverseWords(vector<char>& str){
        int left = 0, n = str.size();
        for (int i = 0; i <= n; ++i) {
            if(i == n || str[i] == ' '){
                reverse(str, left, i);
                left = i + 1;
            }
        }
        reverse(str, 0, n - 1);
    }
};

思路

  • 也可以使用STL中自带的reverse 函数来做
  • 先把整个字符串反转一下
  • 然后扫描每个字符串:
    • 用两个指针,一个指向开头,另一个开始遍历,遇到空格停止,这样两个指针之间就确定了一个单词的范围
    • 再调用reverse反转
    • 然后移动头指针到下一个位置,在用另一个指针扫描
class Solution {
public:
    void reverseWords(vector<char>& str) {
        reverse(str.begin(), str.end());
        for (int i = 0, j = 0; i < str.size(); i = j + 1) {
            for (j = i; j < str.size(); ++j) {
                if (str[j] == ' ') break;
            }
            reverse(str.begin() + i, str.begin() + j);
        }
    }
};

类似题目

题目思路
leetcode:61. 旋转链表,每个节点右移k个位置 Rotate List先遍历整个链表获得链表长度n,然后把链表头部和尾部连接起来,在往后走n - k % n个节点就到达新链表的头结点的前一个节点,这时断开链表即可
leetcode:189. 旋转数组,每个数组右移k个位置 Rotate Array多次反转:先反转全部,然后反转前k个,最后反转剩余的;下标连环怼;使用临时数组
leetcode:151. 给定字符串, 反转字符串中的单词 Reverse Words in a String源字符串为:"the sky is blue ";移除多余空格:“the sky is blue”;字符串反转:“eulb si yks eht”;单词反转:“blue is sky the”
leetcode:186. 给定char数组,翻转字符串里的单词 II Reverse Words in a String II先把每个单词翻转一遍,再把整个字符串翻转一遍,或者也可以调换个顺序,先翻转整个字符串,再翻转每个单词
leetcode:557. 给定字符串, 反转字符串中的单词 III Reverse Words in a String III可以用字符流处理类stringstream来做:按顺序读入每个单词进行翻转即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值