最后一个单词的长度
695 字
3 分钟
最后一个单词的长度
题目链接:58. 最后一个单词的长度 - 力扣(LeetCode)
- 难度:简单
- 标签:字符串
题目描述
Note
原题说明:
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例
- 输入:
s = "Hello World"-> 输出:5 - 输入:
s = " fly me to the moon "-> 输出:4
方案一:反向遍历(我的初版)
核心思路: 字符串的末尾可能存在空格,因此我们从后往前遍历。
- 先跳过末尾所有的空格。
- 开始计数,直到再次遇到空格或遍历完字符串。
源码实现
class Solution {public: int lengthOfLastWord(string s) { int count = 0; // 从后往前遍历 for (int i = s.length() - 1; i >= 0; i--) { if (s[i] != ' ') { count++; // 遇到字母,计数增加 } else if (count != 0) { break; // 遇到空格且已经计过数,说明单词结束 } } return count; }};复杂度分析
- 时间复杂度:。其中 是字符串的长度。虽然最坏情况下会遍历整个字符串,但平均只需扫描最后的单词及空格。
- 空间复杂度:。只使用了常数级的额外变量。
方案二:双指针定位
核心思路: 更清晰地划分两步:第一步确定单词的右边界,第二步确定左边界。
class Solution {public: int lengthOfLastWord(string s) { int r = s.size() - 1; // 1. 跳过尾部空格,锁定右边界 while (r >= 0 && s[r] == ' ') r--;
int l = r; // 2. 向左扫描直到遇到空格,锁定左边界 while (l >= 0 && s[l] != ' ') l--;
return r - l; // 右边界下标 - 左边界下标 }};方案三:一行代码(标准库力量)
利用 C++ 的 stringstream 自动分割空格的特性,我们可以直接提取出最后一个单词。
#include <sstream>#include <string>#include <vector>
class Solution {public: int lengthOfLastWord(string s) { stringstream ss(s); string word; string last; while (ss >> word) { // 自动跳过空格,不断覆盖 last = word; } return last.size(); }};总结
- 从后往前是关键:如果从前往后遍历,需要维护一个变量记录每个单词的长度,效率较低且逻辑复杂。
- 不可忽略尾部空格:像
"a "这样的测试用例,如果不处理尾部空格,结果会误判为0。 - 代码健壮性:确保循环索引
i >= 0是防止越界的基本功。
Tip
字符串反向处理是算法题中的常见考点,掌握了“跳过无效前缀/后缀”的思想,很多题都能迎刃而解!
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
最后更新于 2025-10-14,距今已过 197 天
部分内容可能已过时
相关文章 智能推荐
1
有效的括号
算法 力扣第20题:有效的括号。从“回文”误区到栈(Stack)的经典应用,深入理解括号匹配的 LIFO 逻辑。
2
找出字符串中第一个匹配项的下标
算法 力扣第28题:在字符串中寻找子串。从朴素的滑动窗口到 KMP 算法的“跳跃”艺术,深度剖析字符串匹配的性能巅峰。
3
x 的平方根
算法 力扣第69题:实现 sqrt(x)。深入理解二分查找在数值逼近中的应用,以及避免溢出的数学处理技巧。
4
最长公共前缀
算法 力扣第14题:最长公共前缀。从纵向扫描到横向缩减,再到字典树(Trie)的多种解法深度剖析。
5
罗马数字转整数
算法 力扣第13题:罗马数字转整数。探索如何处理特殊减法规则,并对比函数映射与哈希表两种实现方式。
随机文章 随机推荐