力扣经典150题第二十一题:反转字符串中的单词

简介: 力扣经典150题第二十一题:反转字符串中的单词

力扣经典150题第二十一题:反转字符串中的单词

1. 题目描述

给你一个字符串 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) 额外空间复杂度的 原地 解法。

2. 解题思路

可以使用字符串的分割和倒序处理来实现反转单词顺序。

3. 解题步骤

  1. 使用 trim() 方法去除字符串两端的空格。
  2. 使用 split("\\s+") 方法按照空格拆分字符串,得到单词数组。
  3. 倒序遍历单词数组,构建反转后的字符串。
  4. 使用 StringBuilder 类型的变量来拼接反转后的单词,并在单词之间添加一个空格。
  5. 最终得到的字符串即为反转后的结果。

4. 代码实现

class Solution {
    public String reverseWords(String s) {
        // 去除字符串两端的空格
        String trimmed = s.trim();
        // 按照空格拆分字符串,得到单词数组
        String[] words = trimmed.split("\\s+");
        
        StringBuilder reversed = new StringBuilder();
        
        // 倒序遍历单词数组
        for (int i = words.length - 1; i >= 0; i--) {
            reversed.append(words[i]);
            if (i > 0) {
                reversed.append(" "); // 添加单词之间的空格
            }
        }
        
        return reversed.toString();
    }
}

5. 时间复杂度分析

  • 使用 split("\\s+") 方法对字符串进行拆分,时间复杂度为 O(n),其中 n 是字符串长度。
  • 倒序遍历单词数组构建结果字符串,时间复杂度也为 O(n)。
  • 总体时间复杂度为 O(n),其中 n 是字符串长度。

6. 应用和扩展

  • 该算法可以用于字符串中单词顺序的反转,处理空格分隔的字符串。
  • 可以应用于处理字符串的排版和格式化。

7. 总结

本文介绍了如何通过字符串的分割和倒序遍历来实现字符串中单词顺序的反转,得到反转后的结果字符串。

8. 参考资料

相关文章
|
10月前
|
Go 索引
【LeetCode 热题100】394:字符串解码(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 394:字符串解码。题目要求对编码字符串如 `k[encoded_string]` 进行解码,其中 `encoded_string` 需重复 `k` 次。文章提供了两种解法:使用栈模拟和递归 DFS,并附有 Go 语言实现代码。栈解法通过数字栈与字符串栈记录状态,适合迭代;递归解法则利用函数调用处理嵌套结构,代码更简洁。两者时间复杂度均为 O(n),但递归需注意栈深度问题。文章还总结了解题注意事项及适用场景,帮助读者更好地掌握字符串嵌套解析技巧。
290 6
|
11月前
|
存储 机器学习/深度学习 缓存
🚀 力扣热题 394:字符串解码(详细解析)(Go语言版)
文章提供了两种解法:栈结构和递归解法。栈解法通过维护数字栈与字符串栈,依次处理 `[` 和 `]`,构造解码结果;递归解法则利用函数调用逐层解析嵌套结构。两者时间复杂度均为 $O(n)$,空间复杂度也为 $O(n)$。栈解法直观易懂,适合初学者;递归解法优雅简洁,适合处理深度嵌套规则。掌握这两种方法,可灵活应对类似问题,提升解题能力。
371 11
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
138 9
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
187 1
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
263 0
Leetcode(最后一个单词长度)
这篇文章介绍了两种解决LeetCode第58题的方法,即计算给定字符串中最后一个单词的长度,方法包括翻转字符串和逆向遍历统计。
117 0
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
157 0
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
134 0
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
130 0
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
102 0