本文目录
- 1 中文题目
- 2 求解方法:后向前遍历
- 2.1 方法思路
- 2.2 Python代码
- 2.3 复杂度分析
- 3 题目总结
1 中文题目
给定一个字符串 s
,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个
单词的长度。
单词
是指仅由字母组成、不包含任何空格字符的最大子字符串
。
示例:
输入:s = "Hello World"
输出:5
解释:最后一个单词是“World”,长度为 5。
输入:s = " fly me to the moon "
输出:4
解释:最后一个单词是“moon”,长度为 4。
输入:s = "luffy is still joyboy"
输出:6
解释:最后一个单词是长度为 6 的“joyboy”。
提示:
- 1 ≤ s . l e n g t h ≤ 1 0 4 1 \leq s.length \leq 10^4 1≤s.length≤104
s
仅有英文字母和空格 ’ ’ 组成s
中至少存在一个单词
2 求解方法:后向前遍历
2.1 方法思路
方法核心
从字符串末尾开始向前遍历,先跳过末尾的空格,然后统计最后一个单词的字符数量,直到遇到空格或字符串开头为止,这样可以在一次遍历中完成统计,无需处理整个字符串,也不需要额外的空间来存储分割后的单词。
实现步骤
(1)初始化阶段:
- 初始化结果长度为0
- 获取字符串最后一个字符的索引,准备从后向前遍历
(2)第一阶段处理:
- 跳过字符串末尾的所有空格
- 向前移动直到遇到非空格字符
- 记录第一个非空格字符的位置
(3)第二阶段处理:
- 从第一个非空格字符开始计数
- 继续向前移动直到遇到空格或到达字符串开头
- 累计遇到的字符数量
(4)返回结果:
- 返回统计到的字符数量,这个数量就是最后一个单词的长度
方法示例
以 s = "Hello World "
为例:
初始状态:
s = "Hello World "
length = 0
i = 12 (最后一个索引)第一阶段:跳过末尾空格
1. i = 12, s[12] = ' 'i 减1,变为112. i = 11, s[11] = ' 'i 减1,变为10第二阶段:计算单词长度
1. i = 10, s[10] = 'd'length = 1i 减1,变为92. i = 9, s[9] = 'l'length = 2i 减1,变为83. i = 8, s[8] = 'r'length = 3i 减1,变为74. i = 7, s[7] = 'o'length = 4i 减1,变为65. i = 6, s[6] = 'W'length = 5i 减1,变为56. i = 5, s[5] = ' '遇到空格,停止计数最终结果:
返回 length = 5,即"World"的长度
2.2 Python代码
class Solution:def lengthOfLastWord(self, s: str) -> int:# 初始化长度为0length = 0# 从字符串末尾开始向前遍历i = len(s) - 1# 跳过末尾的空格while i >= 0 and s[i] == ' ':i -= 1# 计算最后一个单词的长度while i >= 0 and s[i] != ' ':length += 1i -= 1return length
2.3 复杂度分析
- 时间复杂度:O(n)
- 最坏情况下需要遍历整个字符串
- 但通常只需要遍历最后一个单词和末尾空格
- 每个字符最多被访问一次
- 所有操作都是常数时间
- 空间复杂度:O(1)
- 只使用了固定的几个变量,不需要额外的数据结构
3 题目总结
题目难度:简单
数据类型:字符串
应用算法:后向前遍历