LeetCode题练习与总结:反转字符串中的单词 Ⅲ -- 557

一、题目描述

给定一个字符串 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 中的所有单词都用一个空格隔开。

二、解题思路

  1. 首先我们需要将字符串按照空格分割成单词数组。
  2. 然后遍历这个数组,将每个单词进行反转。
  3. 最后,我们将反转后的单词数组重新拼接成字符串,单词之间用空格分隔。

三、具体代码

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按空格分割成单词数组。然后,我们使用StringBuilderreverse()方法来反转每个单词,并将反转后的单词添加到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。这种循环简化了遍历数组和集合的语法。
  • 字符串方法

    • 使用 trim() 方法来删除字符串开头和结尾的空白字符。在本例中,它用于删除拼接单词后 StringBuilder 对象末尾的额外空格。
  • 字符串与 StringBuilder 的转换

    • 在代码中,StringBuilder 被用来反转单词,然后通过 toString() 方法转换为 String 类型。
  • 数组的使用

    • 代码中使用数组 String[] words 来存储分割后的单词。
  • 字符串连接

    • 在循环中,通过 append() 方法将反转后的单词和空格连接起来,构建最终的字符串。
  • 字符串的不可变性

    • 代码展示了字符串的不可变性。在 Java 中,字符串对象一旦创建,其内容不可更改。因此,需要使用 StringBuilder 来进行字符串的反转操作。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

你可能感兴趣的:(LeetCode,Java,简单,算法,数据结构,LeetCode,Java,双指针,字符串,职场和发展)