数据结构与算法之 leetcode 字符串反转单词 原地反转 / 分割处理

数据结构与算法阿木 发布于 2025-07-12 13 次阅读


摘要:

字符串反转单词是LeetCode中常见的一道编程题目,主要考察对字符串操作和数据结构的理解。本文将围绕这一主题,分别介绍两种解决策略:原地反转和分割处理,并详细分析其实现原理、代码实现以及优缺点。

一、

字符串反转单词问题要求我们将一个字符串中的单词进行反转,但保持单词内部字符顺序不变。例如,输入字符串 "Hello World" 应输出 "World Hello"。这个问题可以通过多种方法解决,本文将重点介绍两种策略:原地反转和分割处理。

二、原地反转策略

1. 实现原理

原地反转策略的核心思想是将字符串中的单词顺序反转,而不是单词内部的字符顺序。具体步骤如下:

(1)将整个字符串反转;

(2)将每个单词内部的字符顺序反转。

2. 代码实现

python

def reverse_words(s):


将字符串转换为列表,方便操作


s = list(s)


原地反转整个字符串


reverse_string(s, 0, len(s) - 1)


反转每个单词内部的字符顺序


start = 0


for i in range(len(s)):


if s[i] == ' ':


reverse_string(s, start, i - 1)


start = i + 1


反转最后一个单词


reverse_string(s, start, len(s) - 1)


将列表转换回字符串


return ''.join(s)

def reverse_string(s, start, end):


while start < end:


s[start], s[end] = s[end], s[start]


start += 1


end -= 1


3. 优缺点

优点:

- 时间复杂度较低,为O(n),其中n为字符串长度;

- 空间复杂度较低,为O(1),不需要额外的存储空间。

缺点:

- 实现较为复杂,需要处理多个边界情况;

- 对于空格连续的情况,需要额外处理。

三、分割处理策略

1. 实现原理

分割处理策略的核心思想是将字符串按照空格分割成单词列表,然后对单词列表进行反转,最后将反转后的单词列表拼接成字符串。

2. 代码实现

python

def reverse_words(s):


将字符串按照空格分割成单词列表


words = s.split()


反转单词列表


words.reverse()


将单词列表拼接成字符串


return ' '.join(words)


3. 优缺点

优点:

- 实现简单,易于理解;

- 适用于空格连续的情况。

缺点:

- 时间复杂度较高,为O(n),其中n为字符串长度;

- 空间复杂度较高,为O(n),需要额外的存储空间。

四、总结

本文介绍了两种解决字符串反转单词问题的策略:原地反转和分割处理。原地反转策略在时间和空间复杂度上具有优势,但实现较为复杂;分割处理策略实现简单,但时间和空间复杂度较高。在实际应用中,可以根据具体需求选择合适的策略。

五、拓展

1. 支持中文

在处理中文时,需要考虑中文字符之间的空格。可以修改分割处理策略,使用正则表达式分割字符串。

2. 支持标点符号

在处理包含标点符号的字符串时,可以修改分割处理策略,将标点符号视为单词的一部分。

3. 支持大写字母

在处理包含大写字母的字符串时,可以修改分割处理策略,将大写字母视为单词的一部分。

通过以上拓展,可以使字符串反转单词问题更加通用和实用。