反转字符串中的单词 III

标签: 双指针 字符串

难度: Easy

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:

输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

示例 2:

输入: s = "Mr Ding"
输出:"rM gniD"

提示:

  • 1 <= s.length <= 5 * 104
  • s 包含可打印的 ASCII 字符。
  • s 不包含任何开头或结尾空格。
  • s 里 至少 有一个词。
  • s 中的所有单词都用一个空格隔开。

Submission

运行时间: 23 ms

内存: 16.5 MB

class Solution:
    def reverseWords(self, s: str) -> str:
        s_list = s.split(" ")
        ans = [value[::-1] for value in s_list]
        return " ".join(ans)

Explain

这个题解的思路是先将字符串按空格分割成单词数组,然后对每个单词进行反转,最后将反转后的单词数组用空格连接起来得到结果字符串。

时间复杂度: O(n*m)

空间复杂度: O(n)

class Solution:
    def reverseWords(self, s: str) -> str:
        # 将字符串按空格分割成单词数组
        s_list = s.split(" ") 
        # 使用列表推导式对每个单词进行反转
        ans = [value[::-1] for value in s_list]
        # 将反转后的单词数组用空格连接成结果字符串
        return " ".join(ans)

Explore

在处理极大或数据密集的字符串时,split() 和 join() 方法可能会因为内存使用和处理时间的增加而影响性能。split() 方法会遍历整个字符串并创建一个新的字符串列表,这个过程在数据量大时可能会消耗较多的内存和CPU时间。同样,join() 方法需要遍历列表中所有的字符串元素来构建一个新的字符串。如果列表元素众多,这一过程也会占用大量的内存和时间。因此,这两个方法在处理大规模数据时需要考虑性能优化,比如限制输入大小或使用更加高效的数据处理策略。

如果输入字符串s包含连续的空格,使用split(' ')方法分割字符串时,连续的空格会被视为分隔符之间的空字符串。因此,连续空格会导致生成一些空字符串元素。在反转这些空字符串时,它们仍然是空的,但在使用join(' ')连接时,原始字符串中的连续空格会被保留,因为每一个空字符串元素都会被一个空格替代。这样,虽然单词被正确反转,连续空格也得以保留,整体上符合预期的单词反转和空格保留。