问题概述
给定一个字符串,该字符串由单词和空格组成,返回字符串中最后一个单词的长度。单词是仅由非空格字符组成的最大子字符串。
解法 1:分割并获取最后一个
工作原理
按空格分割字符串,获取最后一个单词的长度:
python
class Solution:
def lengthOfLastWord(self, s):
words = s.split()
return len(words[-1]) if words else 0
复杂度分析
- 时间复杂度: O(n) - 分割操作需要扫描整个字符串
- 空间复杂度: O(n) - 创建所有单词的列表
何时使用
- 简单易读
- 适用于短字符串
- 对于非常长的字符串,由于空间开销,不是最优解
解法 2:反向扫描(最优)
工作原理
从字符串末尾扫描,跳过尾随空格,然后计算最后一个单词的字符数:
python
class Solution:
def lengthOfLastWord(self, s):
length = 0
i = len(s) - 1
while i >= 0 and s[i] == ' ':
i -= 1
while i >= 0 and s[i] != ' ':
length += 1
i -= 1
return length
复杂度分析
- 时间复杂度: O(n) - 最坏情况需要扫描整个字符串
- 空间复杂度: O(1) - 只使用常数额外空间
何时使用
- 推荐 - 最优空间复杂度
- 对于长字符串更快(无需创建列表)
- 当最后一个单词靠近末尾时更高效
对比
| 方法 | 时间 | 空间 | 最佳适用 |
|---|---|---|---|
| 分割 | O(n) | O(n) | 短字符串,简单代码 |
| 反向扫描 | O(n) | O(1) | 长字符串,最优空间 |
总结
反向扫描方法在空间复杂度上是最优的,使用 O(1) 额外空间。它从末尾扫描,跳过尾随空格,并计算最后一个单词的字符数。这避免了创建所有单词的列表,使其对长字符串更高效。