LeetCode第58题_最后一个单词的长度

时间:2025-03-02 18:21:14

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 中至少存在一个单词

解题思路

方法一:从后向前遍历

这道题的关键是要处理好字符串末尾的空格和单词的边界。从后向前遍历是一个很好的选择。

关键点:

  1. 从字符串末尾开始遍历,跳过末尾的空格
  2. 统计连续的非空格字符数量
  3. 遇到空格或到达字符串开头时停止

具体步骤:

  1. 初始化单词长度为0
  2. 从字符串末尾开始向前遍历,跳过末尾的空格
  3. 继续向前遍历,统计连续的非空格字符,直到遇到空格或到达字符串开头
  4. 返回统计的字符数量

时间复杂度:O(n),其中n是字符串的长度
空间复杂度:O(1),只需要常数级别的额外空间

方法二:分割字符串

另一种思路是使用字符串分割函数,但这种方法的空间复杂度较高。

具体步骤:

  1. 使用字符串分割函数将字符串按空格分割成数组
  2. 过滤掉空字符串
  3. 返回最后一个单词的长度

时间复杂度: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

代码亮点

  1. ???? 从后向前遍历的方法避免了额外的空间开销
  2. ???? 跳过末尾空格的处理很巧妙
  3. ???? 边界条件处理完善
  4. ???? 代码结构清晰,易于理解

常见错误分析

  1. ???? 没有处理字符串末尾的空格
  2. ???? 没有处理字符串全是空格的情况
  3. ???? 使用Split方法时没有正确处理空字符串
  4. ???? 遍历时的边界条件判断错误

解法对比

解法 时间复杂度 空间复杂度 优点 缺点
从后向前遍历 O(n) O(1) 空间效率高,实现简单 需要仔细处理边界条件
分割字符串 O(n) O(n) 代码简洁,易于理解 空间开销较大

相关题目

  • LeetCode 151. 反转字符串中的单词 - 中等
  • LeetCode 557. 反转字符串中的单词 III - 简单
  • LeetCode 434. 字符串中的单词数 - 简单