LeetCode 58. 最后一个单词的长度
📌 题目描述
题目级别:简单
给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。
单词是指仅由字母组成、不包含任何空格字符的最大子字符串。
- 示例 1:
输入:s = " fly me to the moon "
输出:4
解释:最后一个单词是 “moon”,长度为 4。
💡 破题思路:反向遍历 (单变量状态机)
既然题目要求找“最后一个”单词,最符合直觉且最高效的策略必然是从右向左(反向)遍历。
在这个过程中,我们只需要应对两种物理情况:
- 尾部空格:字符串的最后面可能跟着一堆没用的空格,必须无视它们。
- 目标单词:跳过尾部空格后,遇到的第一串连续字母就是目标单词,数完它的长度后,立刻终止程序。
核心技巧:Dual-purpose Variable (双重用途变量)
我们可以用一个单纯的整型变量f,同时扮演两个角色:
- 角色 1(状态旗帜):当
f == 0时,说明我们还在“尾部空格区”摸黑前进;当f > 0时,说明我们已经进入了“目标单词区”。 - 角色 2(长度计数器):在进入“目标单词区”后,每遇到一个字母,
f就加 1。直到再次遇到空格,说明单词数完了,直接返回f即可!
💻 C++ 代码实现 (原汁原味作者版)
classSolution{public:intlengthOfLastWord(string s){intn=s.size();// f 兼具“是否开始计数”的布尔状态,以及“单词长度”的累加功能intf=0;// 从字符串的最末尾开始,向左倒序遍历for(inti=n-1;i>=0;i--){// 阶段 1:如果还没碰到过字母 (f == 0),且当前是空格,说明这是尾部无用空格,直接跳过if(!f&&s[i]==' ')continue;// 阶段 2:如果碰到了非空格字符(字母)elseif(s[i]!=' '){// 长度累加,同时打破了 !f 的条件,状态切换为“计数中”f++;}// 阶段 3:如果 f 已经大于 0,且当前遇到了空格// 说明我们刚刚完整地数完了一个单词,前方的空格是单词之间的分隔符// 果断直接返回结果,干脆利落!elsereturnf;}// 边界扫尾:如果整个字符串就只有一个单词,且前面没有多余空格,循环结束后返回 freturnf;}};