力扣第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++ 代码

 ​
class Solution {
public:
    string reverseWords(string s) {
        string ans;
        int n = s.size();
        
        // 当输入字符串为空时,直接返回空字符串
        if (n == 0)
            return ans;
        
        // 使用指针right从字符串末尾开始遍历
        int right = n - 1;
        while (right >= 0) {
            // 跳过末尾的空格
            while (right >= 0 && s[right] == ' ')
                right--;
            
            // 如果指针right小于0,表示已经遍历完整个字符串,跳出循环
            if (right < 0)
                break;
            
            // 使用指针left从right开始往前搜索一个完整的单词
            int left = right;
            while (left >= 0 && s[left] != ' ')
                left--;
            
            // 将找到的单词追加到结果字符串ans中,并在单词后面添加一个空格
            ans += s.substr(left + 1, right - left);
            ans += ' ';
            
            // 更新right指针为left,继续搜索下一个单词
            right = left;
        }
        
        // 去掉结果字符串末尾多余的空格(如果有的话)
        if (!ans.empty()) {
            ans.pop_back();
        }

        return ans;
    }
};

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

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

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

你可能感兴趣的:(leetcode,数据结构,算法,c++,leetcode,双指针,单词反转)