LeetCode 58 最后一个单词的长度

1. 题目

58. 最后一个单词的长度

题目描述.

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

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

示例

输入:s = "Hello World"

输出:5

输入:s = " fly me to the moon "

输出:4

输入:s = "luffy"

输出:5

约束

  • (1 <= s.length <= 10^4)

  • s 仅有英文字母和空格 ' ' 组成

  • s 中至少存在一个单词

2. 最佳解题思路描述(从后往前遍历,最优)

  1. 从字符串末尾向前扫描:

    • 先跳过末尾所有连续空格;

    • 再持续计数直到遇到空格或到达字符串开头,计数即为最后单词长度;

  2. 优势:无需完整遍历整个字符串,遇到目标即可停止;

  3. 时间 (O(n)) 最坏,实际常数更小;空间 (O(1))。

3. 我的可优化代码(逻辑正确可 AC,但思路繁琐,变量冗余)

复制代码
class Solution {
public:
    int lengthOfLastWord(string s) {
        int last=0,cur=0;
        int flag = 0;
        for(int i = 0;i<s.length();i++){
            if(s[i]!=' '){
                cur++;
                flag = 0;
            }
            else if(s[i] == ' '&& flag != 1){
                last = cur;
                cur = 0;
                flag = 1;
            }
        }
        if(0 == cur){
            return last;
        }
        else{
            return cur;
        }
    }
};

代码说明

  1. 正确性:逻辑无 bug,可以通过全部测试用例;

    • cur:当前连续单词长度;

    • last:上一段完整单词长度;

    • flag:标记是否刚进入空格段,避免多个连续空格重复覆盖 last;

    • 循环结束后如果末尾不是空格,直接返回 cur,否则返回 last。

  2. 缺陷与可优化点:

    • 正向完整遍历,必须走完整个字符串,末尾大量空格时做无用遍历;

    • 变量过多:last、cur、flag 三个变量维护状态,逻辑绕,可读性差;

    • 多层 if 分支,判断条件复杂,容易写错标记逻辑。

4. 最优标准代码(逆序遍历,极简)

复制代码
class Solution {
public:
    int lengthOfLastWord(string s) {
        int len = 0;
        int i = s.size() - 1;
        // 跳过尾部空格
        while (i >= 0 && s[i] == ' ') {
            i--;
        }
        // 统计最后单词长度
        while (i >= 0 && s[i] != ' ') {
            len++;
            i--;
        }
        return len;
    }
};

5. 总结

  1. 你的正向遍历写法可以通过,但变量多、逻辑复杂,不是最优;

  2. 本题最优策略:逆序扫描,先去尾空格,再统计单词;

  3. 核心边界:字符串尾部带连续空格、仅单个单词、单词间多空格,逆序天然兼容;

  4. 不需要保存上一个单词长度,只需要一次计数。

6. 相关知识拓展

拓展 1:stringstream 分割单词(偷懒写法,面试不推荐)

复制代码
#include <sstream>
int lengthOfLastWord(string s) {
    string word;
    stringstream ss(s);
    while (ss >> word);
    return word.size();
}

利用流自动忽略空格,循环读完最后一个单词;但创建流对象有额外开销。

拓展 2:正向简洁优化版(去掉 flag)

不使用 flag,遇到空格直接重置 cur,每次非空格持续更新 last:

复制代码
int lengthOfLastWord(string s) {
    int len = 0;
    int last = 0;
    for (char c : s) {
        if (c != ' ') {
            len++;
            last = len;
        } else {
            len = 0;
        }
    }
    return last;
}

拓展 3:复杂度对比

  1. 正向遍历(你的代码):(O(n)),(O(1)),全程遍历;

  2. 逆序最优遍历:(O(n)),(O(1)),提前终止;

  3. stringstream 分割:(O(n)),额外容器空间。

相关推荐
地平线开发者25 分钟前
征程6|YOLOv5x 在 Horizon 征程6 上的端到端部署实践(下)
算法·自动驾驶
speop44 分钟前
llm-algo-leetcode |Task01
算法·leetcode·职场和发展
艾为电子1 小时前
【应用方案】电视沉浸式音频升级: 电视音频 awinic“芯片 + 算法” 一体化解决方案
算法·音视频
大熊背1 小时前
树莓派相机自动白平衡详解(二)
算法·白平衡·isppipeline
Scabbards_1 小时前
面试Leetcode - 算法合集
算法·leetcode·面试
chuan.bai2 小时前
Java RAG 实战附录:qwen3 与 bge-m3 模型切换指南
java·人工智能·算法
wuyk5552 小时前
7.AVL 树:第一个自平衡二叉搜索树
开发语言·stm32·单片机·算法
程序猿炎义2 小时前
【llm-algo-leetcode学习笔记】显存与性能认知底座
笔记·学习·leetcode
rannn_1112 小时前
【力扣hot100】二叉树专题+总结
java·算法·leetcode·二叉树
啊嘞嘞?2 小时前
力扣(岛屿数量)
算法·leetcode