一、题目描述
给定一个字符串 s
,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = "Let's take LeetCode contest" 输出:"s'teL ekat edoCteeL tsetnoc"
示例 2:
输入: s = "Mr Ding" 输出:"rM gniD"
提示:
1 <= s.length <= 5 * 10^4
s
包含可打印的 ASCII 字符。s
不包含任何开头或结尾空格。s
里 至少 有一个词。s
中的所有单词都用一个空格隔开。
二、解题思路
- 首先我们需要将字符串按照空格分割成单词数组。
- 然后遍历这个数组,将每个单词进行反转。
- 最后,我们将反转后的单词数组重新拼接成字符串,单词之间用空格分隔。
三、具体代码
class Solution {
public String reverseWords(String s) {
// 将字符串按空格分割成单词数组
String[] words = s.split(" ");
// 创建一个StringBuilder对象用于拼接反转后的单词
StringBuilder reversedString = new StringBuilder();
// 遍历单词数组
for (String word : words) {
// 反转当前单词
String reversedWord = new StringBuilder(word).reverse().toString();
// 将反转后的单词添加到StringBuilder对象中,并在单词后添加一个空格
reversedString.append(reversedWord).append(" ");
}
// 删除最后一个多余的空格,并转换为字符串
return reversedString.toString().trim();
}
}
在这段代码中,我们首先使用split(" ")
方法将输入字符串s
按空格分割成单词数组。然后,我们使用StringBuilder
的reverse()
方法来反转每个单词,并将反转后的单词添加到StringBuilder
对象reversedString
中,每个单词后面添加一个空格。最后,我们使用trim()
方法来删除最后一个多余的空格,并返回最终的字符串。
四、时间复杂度和空间复杂度
1. 时间复杂度
split(" ")
方法:这个方法会遍历整个字符串一次,因此时间复杂度是 O(n),其中 n 是字符串的长度。StringBuilder(word).reverse()
:对于每个单词,我们调用reverse()
方法,该方法会遍历单词中的每个字符一次。假设最坏情况下,每个单词的长度接近 n,则这部分的时间复杂度是 O(n)。- 循环遍历单词数组:假设有 k 个单词,那么循环的时间复杂度是 O(k)。
toString()
和trim()
方法:这些方法的时间复杂度都是 O(n),因为它们需要遍历整个字符串。
综上所述,总的时间复杂度是 O(n) + O(n * k) + O(k) + O(n),简化后是 O(n * k),因为 n * k 是最大的项。由于每个单词的平均长度是 n/k,所以可以近似为 O(n)。
2. 空间复杂度
words
数组:这个数组存储了所有的单词,最坏情况下,如果每个字符都是单词,那么数组的大小将是 O(n)。StringBuilder
对象:这个对象在拼接反转后的单词时,会存储整个反转后的字符串,因此空间复杂度是 O(n)。
综上所述,总的空间复杂度是 O(n) + O(n),简化后是 O(n)。
五、总结知识点
-
字符串分割:
- 使用
String.split(" ")
方法将字符串按照空格分割成单词数组。这个方法基于正则表达式,此处使用空格字符作为分隔符。
- 使用
-
StringBuilder 类:
StringBuilder
类用于构建可变字符串,它的实例可以动态地改变内容,适用于频繁修改字符串的场景。- 使用
new StringBuilder()
创建StringBuilder
对象。 - 使用
append()
方法向StringBuilder
对象中添加字符串。 - 使用
reverse()
方法反转StringBuilder
对象中的字符顺序。 - 使用
toString()
方法将StringBuilder
对象转换为String
对象。
-
增强型 for 循环:
- 使用增强型 for 循环(
for-each
循环)来遍历数组words
。这种循环简化了遍历数组和集合的语法。
- 使用增强型 for 循环(
-
字符串方法:
- 使用
trim()
方法来删除字符串开头和结尾的空白字符。在本例中,它用于删除拼接单词后StringBuilder
对象末尾的额外空格。
- 使用
-
字符串与 StringBuilder 的转换:
- 在代码中,
StringBuilder
被用来反转单词,然后通过toString()
方法转换为String
类型。
- 在代码中,
-
数组的使用:
- 代码中使用数组
String[] words
来存储分割后的单词。
- 代码中使用数组
-
字符串连接:
- 在循环中,通过
append()
方法将反转后的单词和空格连接起来,构建最终的字符串。
- 在循环中,通过
-
字符串的不可变性:
- 代码展示了字符串的不可变性。在 Java 中,字符串对象一旦创建,其内容不可更改。因此,需要使用
StringBuilder
来进行字符串的反转操作。
- 代码展示了字符串的不可变性。在 Java 中,字符串对象一旦创建,其内容不可更改。因此,需要使用
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。
标签:空格,数组,--,StringBuilder,557,单词,复杂度,字符串,LeetCode From: https://blog.csdn.net/weixin_62860386/article/details/145216266