58.最后一个单词的长度

58.最后一个单词的长度


58.1 题目

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

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

示例 1:

输入:s = "Hello World"
输出:5
解释:最后一个单词是“World”,长度为 5

示例 2:

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

示例 3:

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

提示:

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

58.2 题解

方法一:分割字符串成字符串数组返回末尾元素

思路

使用 Split 方法按空格分割字符串,自动去除多余空格。直接返回最后一个单词的长度。简单直观,但会创建额外的字符串数组。

核心思想:利用 Split 自动处理空格,取最后一个单词。

具体步骤

  1. 使用 Split(' ', StringSplitOptions.RemoveEmptyEntries) 分割字符串。
  2. 返回最后一个单词的长度。

举例:对于 s = "Hello World"

  • 分割后:["Hello", "World"]
  • 最后一个单词 "World",长度 5

复杂度分析

  • 时间复杂度:O(n),分割字符串需要遍历一次。
  • 空间复杂度:O(n),存储分割后的单词数组。

代码

// 方法一:分割字符串成字符串数组返回末尾元素
static int LengthOfLastWord1(string s)
{
    // 使用 Split 方法将字符串按空格分割成单词数组
    string[] words = s.Split(' ', StringSplitOptions.RemoveEmptyEntries);

    // 如果单词数组为空,说明字符串中没有单词
    if (words.Length == 0)
    {
        return 0;
    }

    // 返回最后一个单词的长度
    return words[words.Length - 1].Length;
}

方法二:反向遍历检查空格

思路

从字符串末尾开始反向遍历。第一步:跳过末尾的所有空格,找到最后一个单词的结尾。第二步:继续反向遍历,直到遇到空格或到达字符串开头,统计单词长度。不需要额外空间,直接计算长度。

核心思想:反向遍历,先跳过空格再统计单词长度。

具体步骤

  1. 从字符串末尾开始,跳过所有空格。
  2. 继续反向遍历,统计非空格字符数量。
  3. 遇到空格或到达开头时返回长度。

举例:对于 s = " fly me to the moon "

  • 跳过末尾空格:索引到达 'n'
  • 统计单词:'n', 'o', 'o', 'm' → 长度 4
  • 遇到空格,返回 4

复杂度分析

  • 时间复杂度:O(n),最坏情况遍历整个字符串。
  • 空间复杂度:O(1),只使用常数额外空间。

代码

// 方法二:反向遍历检查空格
static int LengthOfLastWord2(string s)
{
    // 初始化变量 endIndex,表示字符串中最后一个非空格字符的索引
    int endIndex = s.Length - 1;

    // 从字符串末尾开始,向前遍历,直到找到第一个非空格字符为止
    while (s[endIndex] == ' ')
    {
        endIndex--;
    }

    // 将 beginIndex 初始化为 endIndex,表示当前找到的最后一个非空格字符的索引
    int beginIndex = endIndex;

    // 继续向前遍历,找到当前单词的第一个字符的索引或者到达字符串的开头
    while (beginIndex >= 0 && s[beginIndex] != ' ')
    {
        beginIndex--;
    }

    // 返回最后一个单词的长度,即 endIndex 减去 beginIndex
    return endIndex - beginIndex;
}

58.3 代码

using System;

class Program
{
    static void Main()
    {
        #region 题目

        // 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。
        // 返回字符串中 最后一个 单词的长度。
        // 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

        // 示例 1:
        // 输入:s = "Hello World"
        // 输出:5
        // 解释:最后一个单词是“World”,长度为5。

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

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

        // 提示:
        // 1 <= s.length <= 104
        // s 仅有英文字母和空格 ' ' 组成
        // s 中至少存在一个单词

        #endregion

        #region 测试

        // 示例 1
        string str1 = "Hello World";
        int result1_1 = LengthOfLastWord1(str1);
        Console.WriteLine($"示例1 方法1 输出:{result1_1}");
        int result1_2 = LengthOfLastWord2(str1);
        Console.WriteLine($"示例1 方法2 输出:{result1_2}");

        // 示例 2
        string str2 = "   fly me   to   the moon  ";
        int result2_1 = LengthOfLastWord1(str2);
        Console.WriteLine($"示例2 方法1 输出:{result2_1}");
        int result2_2 = LengthOfLastWord2(str2);
        Console.WriteLine($"示例2 方法2 输出:{result2_2}");

        // 示例 3
        string str3 = "luffy is still joyboy";
        int result3_1 = LengthOfLastWord1(str3);
        Console.WriteLine($"示例3 方法1 输出:{result3_1}");
        int result3_2 = LengthOfLastWord2(str3);
        Console.WriteLine($"示例3 方法2 输出:{result3_2}");

        #endregion
    }

    #region 答案

    // 方法一:分割字符串成字符串数组返回末尾元素
    static int LengthOfLastWord1(string s)
    {
        // 使用 Split 方法将字符串按空格分割成单词数组
        string[] words = s.Split(' ', StringSplitOptions.RemoveEmptyEntries);

        // 如果单词数组为空,说明字符串中没有单词
        if (words.Length == 0)
        {
            return 0;
        }

        // 返回最后一个单词的长度
        return words[words.Length - 1].Length;
    }

    // 方法二:反向遍历检查空格
    static int LengthOfLastWord2(string s)
    {
        // 初始化变量 endIndex,表示字符串中最后一个非空格字符的索引
        int endIndex = s.Length - 1;

        // 从字符串末尾开始,向前遍历,直到找到第一个非空格字符为止
        while (s[endIndex] == ' ')
        {
            endIndex--;
        }

        // 将 beginIndex 初始化为 endIndex,表示当前找到的最后一个非空格字符的索引
        int beginIndex = endIndex;

        // 继续向前遍历,找到当前单词的第一个字符的索引或者到达字符串的开头
        while (beginIndex >= 0 && s[beginIndex] != ' ')
        {
            beginIndex--;
        }

        // 返回最后一个单词的长度,即 endIndex 减去 beginIndex
        return endIndex - beginIndex;
    }

    #endregion
}

58.4 运行结果

示例1 方法1 输出:5
示例1 方法2 输出:5
示例2 方法1 输出:4
示例2 方法2 输出:4
示例3 方法1 输出:6
示例3 方法2 输出:6


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏