反转字符串中的单词

8640eb2b95db42e9bfda887dbeb51a61.png

 反转字符串中的单词

题目:

557. 反转字符串中的单词 III - 力扣(LeetCode)

思路:

  1. 不开辟空间的解决方式
  2. 这里设定一个快慢下标,快的下标去寻找空格,找到之后,进行交换并且更新慢的下标
  3. 这里会存在一种可能性,那就是空格不只是一个,所以我们更新慢的下标的时候需要使用一个循环来跳过所有的空格

代码

class Solution {
public:
    string reverseWords(string s) {
        //首先我们是在string类的空间里面进行交换
        //首先我们假设i是快的下标,val是慢的下标
        //这样设定的原因是我当时画图的图解是i和val,其实这个命名有点不合理,begin和end命名会合理一点
        int len = s.size();
        int i = 0; 
        int val = i;

        //这里是一个大循环,我们i进行++的时候是不能越界的
        while(i < len)
        {
            //首先我们i++,找到空格
            //但是此时i找到空格后,此时存在一个问题就是,i此时是指向空格的,所以我们进行前后指针交换的时候是需要end = i - 1
            while(i < len && s[i] != ' ')
            {
                i++;
            }

            //此时可以利用前后指针进行交换
            //也可以利用库里面的交换函数进行交换
            //但是我们不能移动i和val所以赋值
            int left = val;int right = i - 1;
            while(left < right)
            {
                //swap[left], s[right]);
                char tmp=s[left];
                s[left]=s[right];
                s[right]=tmp;
                left++;
                right--;
            }

            //跳过空格,这里加上i < len 是很有必要的,不然最后一组会很容易产生越界行为,从而导致死循环
            while(i < len && s[i] == ' ')
            {
                i++;
            }

            //跳过空格之后进行赋值
            val = i;
        }
        return s;
    }
};

代码解释:

  1. 变量初始化

    • int len = s.size();:计算输入字符串 s 的长度,以便后续使用该长度作为循环的边界。
    • int i = 0; int val = i;
      • i 是快指针,用于遍历字符串。
      • val 是慢指针,用于标记每个单词的起始位置。开始时,它们都初始化为 0。
  2. 主循环

    • while (i < len) {...}:这是一个大循环,用于遍历整个字符串。
  3. 寻找单词的结束位置

    • while (i < len && s[i]!= ' ') { i++; }
      • 这个内层循环的目的是找到一个单词的结束位置。只要 i 小于字符串长度且当前字符不是空格,i 就会自增,直到找到空格或者到达字符串的末尾。
  4. 反转单词

    • int left = val; int right = i - 1;
      • 当找到一个单词的结束位置(由 i 标记)后,left 被设置为该单词的起始位置(val),right 被设置为该单词的结束位置(i - 1),因为 i 指向的是空格,所以 i - 1 是单词的最后一个字符。
    • while (left < right) {...}
      • 这个双指针循环用于交换单词中的字符。使用一个临时变量 tmp 来交换 s[left] 和 s[right] 的值,然后 left 加 1,right 减 1,直到 left >= right,完成单词的反转。
      • 这里为了方便也可以采取swap的方式来进行交换
  5. 跳过空格

    • while (i < len && s[i] == ' ') { i++; }
      • 这个内层循环用于跳过单词之间的空格,确保 i 指向新单词的起始位置。
  6. 更新起始位置

    • val = i;
      • 把 val 更新为下一个单词的起始位置,以便下一次循环可以找到并反转下一个单词。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值