首页 > 其他分享 >151. 反转字符串中的单词【 力扣(LeetCode) 】

151. 反转字符串中的单词【 力扣(LeetCode) 】

时间:2024-08-09 18:26:23浏览次数:20  
标签:151 空格 end int 力扣 start 字符串 单词 LeetCode

一、题目描述

  给你一个字符串 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 中 至少存在一个 单词

三、解题思路

  1. 基本思路:
      这一题其实就是删除重复元素+循环移位的杂糅题,先删除多余空格,然后反转字符串,再对每个单词进行反转即可。
  2. 具体思路:
    • 预处理:使用双指针 i 和 k,i 用于遍历字符串,k 用于存放不需要删除的元素。定义变量 start 和 end ,start 表示一个单词的首字母下标,end 表示一个单词后面的空格下标。
    • 删除多余空格:只要遇到不需要删除的元素,则把 i 所指的元素赋值给 k 。不需要删除的情况包括:①该元素不是空格;②该元素是空格,但是前面没有保存空格且该元素不是第一个需要保存的元素【单词之间至少需要一个空格,第一个元素不能为空格】;该方法每个单词后面至多会跟一个空格,所以记得判断最后一个单词尾部是否有空格,有就删除。
    • 反转单词:①先全部反转,将单词定位到正确位置;②定位到正确位置的单词,对其进行反转,将字母定位到正确位置;【例如:i love you ,执行完操作①变为:uoy evol i ,此时单词位置正确,但每个单词的字母位置不对,所以执行操作②,将每个单词单独进行反转,即变为:you love i 】

四、参考代码

时间复杂度: O ( n ) \Omicron(n) O(n)
空间复杂度: O ( 1 ) \Omicron(1) O(1)

class Solution {
public:
    void reverse(string& s, int start, int end) {
        int mid = (end - start) / 2;

        for (int i = 0; i <= mid; i++) {
            swap(s[start + i], s[end - i]);
        }
    }

    string reverseWords(string s) {
        int n = s.length();
        int k = 0;

        for (int i = 0; i < n; i++) {
            if (s[i] != ' ' || (k > 0 && s[i] == ' ' && s[k - 1] != ' ')) {
                s[k++] = s[i];
            }
        }
        if (s[k - 1] == ' ')
            k--;
        reverse(s, 0, k - 1);

        int start = 0, end;

        for (end = 1; end < k; end++) {
            if (s[end] == ' ') {
                reverse(s, start, end - 1);
                start = end + 1;
            }
        }
        reverse(s, start, end - 1);

        return s.substr(0,k);
    }
};

标签:151,空格,end,int,力扣,start,字符串,单词,LeetCode
From: https://blog.csdn.net/yyh520025/article/details/141027475

相关文章

  • LeetCode | 344 Reverse String
    分析字符数组本质上还是数组,双指针本质上是遍历,遍历过程只处理两个独立数据,移动过程将问题分为已经解决和未解决的两部分。在这个题目中值得注意的是,关于字符数组进行数据原地交换采用的是异或^的方式主类packagecom.github.dolphinmind.string;/***@authordolphinmind......
  • LeetCode | 383 RanSom Note
    分析赎金信在侦探系列是容易出现的场景,为了不暴露自己的笔迹,利用一本杂志里面已有的字符来组装自己的信。倘若这本杂志的字符不够,那么赎金信就无法完成。这道题与Valid-Anagram本质上是一致的。Anagram要求字符类型和数量完全一致,本题要求杂志里面所有的字符串类型和数量是赎金信......
  • 【Leetcode 169 】 多数元素——投票算法要把我迷倒了
     给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊n/2⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:nums=[3,2,3]输出:3示例 2:输入:nums=[2,2,1,1,1,2,2]输出:2提示:n==nums......
  • LeetCode | 1 Two Sum
    分析Givenanarrayofintegersnumsandanintegertarget,returnindicesofthetwonumberssuchthattheyadduptotarget.Youmayassumethateachinputwouldhaveexactlyonesolution,andyoumaynotusethesameelementtwice.Youcanreturnthean......
  • Leetcode | 202 Happy Number
    分析在快乐数的题意上,通常情况下我们都会去顺着题目的意思去寻找最终结果是否为1,而后面的另一句话很有启示意义:"也可能是无限循环,但始终变不到1",那么为什么不会是无限不循环呢?证明范围限制:对于一个(d)位数的正整数(n),其最大值为99d=Max位数减少:每次计算之后,数字位数d要么减......
  • Leetcode热题100-128.最长连续序列
    Leetcode热题100-128.最长连续序列1.题目描述2.解题思路3.代码实现1.题目描述128.最长连续序列2.解题思路使用哈希集合的思想:初始化一个unordered_set并将nums中所有元素放入集合中;遍历数组,依次判断当前元素是否为连续序列的开始,若是则求出当前连续序列......
  • leetcode考试题
       +-------------+----------+|ColumnName|Type|+-------------+----------+|id|int||client_id|int||driver_id|int||city_id|int||status|enum||request_at|varchar|......
  • LeetCode | 349 Intersection Of Two Arrays
    分析两个数组的交集,双指针使用的前提是,两个数组已经处于有序状态。双指针的本质是遍历;双指针在线性数据结构中,进行数据处理,每次只专注于两个元素;指针遍历将问题拆解为两部分,即已解决和待解决问题。倘若两个数组是无序的状态,双指针指向每次都无法确认是否在历史中已经出现过,这个时......
  • fiftyone localhost:5151页面打开空白 error: disallowed MIME type (“text/plain”)
    解决办法:您必须更改两个键的注册表设置。打开注册表编辑器并前往Computer\HKEY_CLASSES_ROOT\.js并更改ContentType为application/javascript前往Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.js并更改 ContentType为application/javascript。然后只需重新启动shell......
  • LeetCode 1111. 有效括号的嵌套深度
    1111.有效括号的嵌套深度有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。详情参见题末「嵌套深度」部分。有......