• 力扣第151题 反转字符串中的单词 c++双指针


    题目

    151. 反转字符串中的单词

    中等

    给你一个字符串 s ,请你反转字符串中 单词 的顺序。

    单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

    返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

    注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

    示例 1:

    输入:s = "the sky is blue"
    输出:"blue is sky the"
    

    示例 2:

    输入:s = "  hello world  "
    输出:"world hello"
    解释:反转后的字符串中不能存在前导空格和尾随空格。
    

    示例 3:

    输入:s = "a good   example"
    输出:"example good a"
    解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
    

    提示:

    • 1 <= s.length <= 104
    • s 包含英文大小写字母、数字和空格 ' '
    • s 中 至少存在一个 单词

    进阶:如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度的 原地 解法。

    思路和解题方法

    1. 首先定义了一个空字符串ans用于存储最终的结果。
    2. 获取输入字符串s的长度,并进行特判,如果字符串为空,则直接返回空字符串。
    3. 定义指针right初始化为字符串末尾的下标。
    4. 进入循环,循环条件为right大于等于0。
    5. 在内层循环中,先通过while循环跳过末尾的空格,每次将right向前移动一位,直到right小于0或者指向的字符不是空格。
    6. 如果right小于0,则表示已经遍历完整个字符串,跳出循环。
    7. right赋值给指针left,用于标记单词的起始位置。
    8. 在内层循环中,再通过while循环向前搜索一个完整的单词,每次将left向前移动一位,直到left小于0或者指向的字符是空格。
    9. 使用substr函数获取left+1right之间的子串,即为一个完整的单词,并将其追加到结果字符串ans中。
    10. 在单词后面添加一个空格。
    11. 更新指针rightleft,继续搜索下一个单词。
    12. 循环结束后,如果结果字符串ans不为空,则去掉最后一个字符(多余的空格)。
    13. 返回结果字符串ans

    复杂度

            时间复杂度:

                    O(n)

    • 时间复杂度:O(n),其中n为输入字符串s的长度。算法遍历了整个字符串,时间复杂度为线性级别。

            空间复杂度

                    O(n)

    • 空间复杂度:O(n),其中n为输入字符串s的长度。算法需要创建一个新的字符串ans来存储结果,其大小与输入字符串的长度相同。

    c++ 代码

     ​
    
    1. class Solution {
    2. public:
    3. string reverseWords(string s) {
    4. string ans;
    5. int n = s.size();
    6. // 当输入字符串为空时,直接返回空字符串
    7. if (n == 0)
    8. return ans;
    9. // 使用指针right从字符串末尾开始遍历
    10. int right = n - 1;
    11. while (right >= 0) {
    12. // 跳过末尾的空格
    13. while (right >= 0 && s[right] == ' ')
    14. right--;
    15. // 如果指针right小于0,表示已经遍历完整个字符串,跳出循环
    16. if (right < 0)
    17. break;
    18. // 使用指针left从right开始往前搜索一个完整的单词
    19. int left = right;
    20. while (left >= 0 && s[left] != ' ')
    21. left--;
    22. // 将找到的单词追加到结果字符串ans中,并在单词后面添加一个空格
    23. ans += s.substr(left + 1, right - left);
    24. ans += ' ';
    25. // 更新right指针为left,继续搜索下一个单词
    26. right = left;
    27. }
    28. // 去掉结果字符串末尾多余的空格(如果有的话)
    29. if (!ans.empty()) {
    30. ans.pop_back();
    31. }
    32. return ans;
    33. }
    34. };

    觉得有用的话可以点点赞,支持一下。

    如果愿意的话关注一下。会对你有更多的帮助。

    每天都会不定时更新哦  >人<  。

  • 相关阅读:
    Java 大厂八股文面试专题-JVM相关面试题 垃圾回收算法 GC JVM调优
    ssm和springboot的区别
    Effective-java-读书笔记之异常
    JavaScript
    [国产MCU]-W801开发实例-TCP客户端与服务器实现
    基于华为云服务器docker配置Elasticsearch集群
    【仿真动画】ABB IRB 8700 机器人搬运(ruckig在线轨迹生成)动画欣赏
    asp.net core webapi signalR通信
    Redis实现全局唯一ID
    Error:QSqlDatabase: QMYSQL driver not loaded (Qt+C++ 找不到mysql的驱动)
  • 原文地址:https://blog.csdn.net/jgk666666/article/details/133364809