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

发布于:2025-03-03 ⋅ 阅读:(37) ⋅ 点赞:(0)

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) 代码简洁,易于理解 空间开销较大

相关题目