力扣经典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. 解题步骤
- 使用 trim() 方法去除字符串两端的空格。
- 使用 split("\\s+") 方法按照空格拆分字符串,得到单词数组。
- 倒序遍历单词数组,构建反转后的字符串。
- 使用 StringBuilder 类型的变量来拼接反转后的单词,并在单词之间添加一个空格。
- 最终得到的字符串即为反转后的结果。
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. 总结
本文介绍了如何通过字符串的分割和倒序遍历来实现字符串中单词顺序的反转,得到反转后的结果字符串。