ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【Classic 150 刷题计划】 LeetCode 58. 最后一个单词的长度 | C++ 极简反向遍历与单变量状态机

【Classic 150 刷题计划】 LeetCode 58. 最后一个单词的长度 | C++ 极简反向遍历与单变量状态机 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){intns.size();// f 兼具“是否开始计数”的布尔状态以及“单词长度”的累加功能intf0;// 从字符串的最末尾开始向左倒序遍历for(intin-1;i0;i--){// 阶段 1如果还没碰到过字母 (f 0)且当前是空格说明这是尾部无用空格直接跳过if(!fs[i] )continue;// 阶段 2如果碰到了非空格字符字母elseif(s[i]! ){// 长度累加同时打破了 !f 的条件状态切换为“计数中”f;}// 阶段 3如果 f 已经大于 0且当前遇到了空格// 说明我们刚刚完整地数完了一个单词前方的空格是单词之间的分隔符// 果断直接返回结果干脆利落elsereturnf;}// 边界扫尾如果整个字符串就只有一个单词且前面没有多余空格循环结束后返回 freturnf;}};
返回列表