面试经典150题[019]:最后一个单词的长度(LeetCode 58)

最后一个单词的长度(LeetCode 58)

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

难度:简单

1. 题目描述

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

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

要求:

  • 1 <= s.length <= 10^4
  • s 仅有英文字母和空格 ' ' 组成
  • s 中至少存在一个单词

示例:

复制代码
输入: s = "Hello World"
输出: 5
解释: 最后一个单词是"World",长度为 5。

输入: s = "   fly me   to   the moon  "
输出: 4
解释: 最后一个单词是"moon",长度为 4。

输入: s = "luffy is still joyboy"
输出: 6
解释: 最后一个单词是长度为 6 的"joyboy"。

2. 问题分析

2.1 规律

  • 字符串可能有前导、尾随或中间多个空格。
  • 单词仅由连续字母组成,不含空格。
  • 由于至少有一个单词,不需要处理空字符串或全空格情况。
  • 核心问题:如何高效找到最后一个单词并计算其长度? 避免不必要的遍历或拆分操作,以优化时间。

2.2 贪心思路

我们使用从后往前遍历的贪心策略:

  • 从字符串末尾开始,跳过所有尾部空格,定位到最后一个单词的末尾字母。
  • 然后,继续往前计数连续字母,直到遇到空格或字符串开头。
  • 这确保只处理最后一个单词,避免拆分整个字符串(split操作会O(n)但常数较大)。
  • 为什么从后往前? 因为我们只关心最后一个单词,直接从尾部入手最高效,避免遍历无关部分。

2.3 示例

s = " fly me to the moon "为例:

  • 字符串长度=29,末尾有2个空格。
  • 从i=28开始(最后一个空格),往前跳过空格,直到i=26('n')。
  • 现在计数:i=26('n') length=1;i=25('o') length=2;i=24('o') length=3;i=23('m') length=4。
  • i=22是空格,停止计数,返回4。

3. 代码实现

Python

python 复制代码
class Solution:
    def lengthOfLastWord(self, s: str) -> int:
        i = len(s) - 1
        while i >= 0 and s[i] == ' ':
            i -= 1
        length = 0
        while i >= 0 and s[i] != ' ':
            length += 1
            i -= 1
        return length

C++

cpp 复制代码
class Solution {
public:
    int lengthOfLastWord(std::string s) {
        int i = s.length() - 1;
        while (i >= 0 && s[i] == ' ') {
            i--;
        }
        int length = 0;
        while (i >= 0 && s[i] != ' ') {
            length++;
            i--;
        }
        return length;
    }
};

4. 复杂度分析

  • 时间复杂度:O(n),最坏情况下遍历整个字符串(例如全字母无空格),但实际常数小,因为通常只遍历尾部。
  • 空间复杂度:O(1),只使用常数额外空间。

5. 总结

  • 字符串 + 最后一个单词长度 → 从后往前遍历是首选,简单高效。
  • 核心是跳过尾空格 + 计数连续字母,很通用。
    • 可扩展到类似问题,如计数所有单词或处理变体。
    • 比split()更优,避免创建额外数组。

复习

面试经典150题[004]:删除有序数组中的重复项 II(LeetCode 80)

面试经典150题[005]:多数元素(LeetCode 169)

面试经典150题[012]:O(1) 时间插入、删除和获取随机元素(LeetCode 380)

相关推荐
_饭团8 分钟前
字符串函数全解析:12 种核心函数的使用与底层模拟实现
c语言·开发语言·学习·考研·面试·蓝桥杯
想吃火锅10059 分钟前
【leetcode】105. 从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展
圣保罗的大教堂10 分钟前
leetcode 3567. 子矩阵的最小绝对差 中等
leetcode
前端摸鱼匠21 分钟前
面试题4:多头注意力(MHA)相比单头注意力的优势是什么?Head数如何影响模型?
人工智能·ai·面试·职场和发展·求职招聘
呆瑜nuage38 分钟前
【复习系列】高频C/C++库函数手写实现指南与自定义类型的理解指南
c语言·c++·面试
li星野1 小时前
C++面试真题分享20260320
java·c++·面试
老鼠只爱大米1 小时前
LeetCode经典算法面试题 #215:数组中的第K个最大元素(快速选择、堆排序、计数排序等多种实现方案详解)
算法·leetcode·堆排序·快速选择·topk·数组中的第k个最大元素
逆境不可逃1 小时前
LeetCode 热题 100 之 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
_日拱一卒1 小时前
LeetCode:移动零
算法·leetcode·职场和发展
_日拱一卒2 小时前
LeetCode:字母异位词分组
算法·leetcode·职场和发展