力扣经典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. 参考资料

相关文章
|
2月前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
36 1
|
2月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
25 9
|
2月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
20 0
|
2月前
Leetcode(最后一个单词长度)
这篇文章介绍了两种解决LeetCode第58题的方法,即计算给定字符串中最后一个单词的长度,方法包括翻转字符串和逆向遍历统计。
22 0
|
2月前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
30 0
|
2月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
20 0
|
2月前
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
22 0
|
2月前
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
16 0
|
4月前
|
算法
LeetCode第58题最后一个单词的长度
LeetCode第58题"最后一个单词的长度"的解题方法,通过从字符串末尾向前遍历并计数非空格字符,直接得出最后一个单词的长度。
LeetCode第58题最后一个单词的长度
|
4月前
|
存储 算法
LeetCode第43题字符串相乘
LeetCode第43题"字符串相乘"的解题方法,通过使用数组存储乘积并处理进位,避免了字符串转换数字的复杂性,提高了算法效率。
LeetCode第43题字符串相乘