557.反转字符串中的单词

给定一个字符串 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 中的所有单词都用一个空格隔开

解题思路:双指针法,从字符串开始位置从前向后找' ',pos为find返回的下标位置,再设置一指针pre记录当前pos位置 ,再让pos指向下一个空格,再次用pre记录位置,直到pos为npos(当find找不到时返回npos),此时pos位置时最后一个空格的位置,但后面还有一个单词没有反转,在返回前反转最后一个单词即可

class Solution {
public:
    void reserve(string& s, int begin, int end)
    {
        while (begin < end)
        {
            swap(s[begin++], s[end--]);
        }
    }
    string reverseWords(string& s) {
        //找空格,直到等于npos
        //设置一个pre指针指向上一次find的位置
        int pre = 0, pos;
        while (1)
        {
            pos = s.find(' ', pre);
            if (pos == string::npos)
            {
                reserve(s, pre, s.size() - 1);
                return s;
            }
            reserve(s, pre, pos - 1);
            pre = pos + 1;//此刻二者都指向' '
        }
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值