LeetCode 第58题:最后一个单词的长度
题目描述
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
难度
简单
题目链接
点击在LeetCode中查看题目
示例
示例 1:
输入:s = "Hello World"
输出:5
解释:最后一个单词是"World",长度为5。
示例 2:
输入:s = " fly me to the moon "
输出:4
解释:最后一个单词是"moon",长度为4。
示例 3:
输入:s = "luffy is still joyboy"
输出:6
解释:最后一个单词是"joyboy",长度为6。
提示
1 <= s.length <= 10⁴
-
s
仅有英文字母和空格' '
组成 -
s
中至少存在一个单词
解题思路
方法一:从后向前遍历
这道题的关键是要处理好字符串末尾的空格和单词的边界。从后向前遍历是一个很好的选择。
关键点:
- 从字符串末尾开始遍历,跳过末尾的空格
- 统计连续的非空格字符数量
- 遇到空格或到达字符串开头时停止
具体步骤:
- 初始化单词长度为0
- 从字符串末尾开始向前遍历,跳过末尾的空格
- 继续向前遍历,统计连续的非空格字符,直到遇到空格或到达字符串开头
- 返回统计的字符数量
时间复杂度:O(n),其中n是字符串的长度
空间复杂度:O(1),只需要常数级别的额外空间
方法二:分割字符串
另一种思路是使用字符串分割函数,但这种方法的空间复杂度较高。
具体步骤:
- 使用字符串分割函数将字符串按空格分割成数组
- 过滤掉空字符串
- 返回最后一个单词的长度
时间复杂度:O(n)
空间复杂度:O(n),需要存储分割后的字符串数组
代码实现
C# 实现(从后向前遍历)
public class Solution {
public int LengthOfLastWord(string s) {
int length = 0;
int i = s.Length - 1;
// 跳过末尾的空格
while (i >= 0 && s[i] == ' ') {
i--;
}
// 统计最后一个单词的长度
while (i >= 0 && s[i] != ' ') {
length++;
i--;
}
return length;
}
}
C# 实现(分割字符串)
public class Solution {
public int LengthOfLastWord(string s) {
string[] words = s.Split(' ', StringSplitOptions.RemoveEmptyEntries);
return words[words.Length - 1].Length;
}
}
执行结果
方法一(从后向前遍历):
- 执行用时:52 ms
- 内存消耗:36.7 MB
方法二(分割字符串):
- 执行用时:64 ms
- 内存消耗:37.1 MB
代码亮点
- ???? 从后向前遍历的方法避免了额外的空间开销
- ???? 跳过末尾空格的处理很巧妙
- ???? 边界条件处理完善
- ???? 代码结构清晰,易于理解
常见错误分析
- ???? 没有处理字符串末尾的空格
- ???? 没有处理字符串全是空格的情况
- ???? 使用Split方法时没有正确处理空字符串
- ???? 遍历时的边界条件判断错误
解法对比
解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 |
---|---|---|---|---|
从后向前遍历 | O(n) | O(1) | 空间效率高,实现简单 | 需要仔细处理边界条件 |
分割字符串 | O(n) | O(n) | 代码简洁,易于理解 | 空间开销较大 |
相关题目
- LeetCode 151. 反转字符串中的单词 - 中等
- LeetCode 557. 反转字符串中的单词 III - 简单
- LeetCode 434. 字符串中的单词数 - 简单