最后一个单词的长度

695 字
3 分钟
最后一个单词的长度

题目链接:58. 最后一个单词的长度 - 力扣(LeetCode)

  • 难度:简单
  • 标签:字符串

题目描述#

Note

原题说明: 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

示例#

  • 输入: s = "Hello World" -> 输出: 5
  • 输入: s = " fly me to the moon " -> 输出: 4

方案一:反向遍历(我的初版)#

核心思路: 字符串的末尾可能存在空格,因此我们从后往前遍历。

  1. 先跳过末尾所有的空格。
  2. 开始计数,直到再次遇到空格或遍历完字符串。

源码实现#

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;
}
};

复杂度分析#

  • 时间复杂度O(n)O(n)。其中 nn 是字符串的长度。虽然最坏情况下会遍历整个字符串,但平均只需扫描最后的单词及空格。
  • 空间复杂度O(1)O(1)。只使用了常数级的额外变量。

方案二:双指针定位#

核心思路: 更清晰地划分两步:第一步确定单词的右边界,第二步确定左边界。

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

字符串反向处理是算法题中的常见考点,掌握了“跳过无效前缀/后缀”的思想,很多题都能迎刃而解!

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

最后一个单词的长度
https://firefly-7a0.pages.dev/posts/leetcode_notes/58length-of-last-word/
作者
lonelystar
发布于
2025-10-14
许可协议
CC BY-NC-SA 4.0
最后更新于 2025-10-14,距今已过 197 天

部分内容可能已过时

评论区

Profile Image of the Author
LonelyStar
Hello, I'm LonelyStar.
公告
欢迎来到我的博客!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
119
分类
11
标签
346
总字数
226,548
运行时长
0
最后活动
0 天前

目录