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^4s仅由英文字母和空格' '组成s中至少存在一个单词
58.2 题解
方法一:分割字符串成字符串数组返回末尾元素
思路
使用 Split 方法按空格分割字符串,自动去除多余空格。直接返回最后一个单词的长度。简单直观,但会创建额外的字符串数组。
核心思想:利用 Split 自动处理空格,取最后一个单词。
具体步骤:
- 使用
Split(' ', StringSplitOptions.RemoveEmptyEntries)分割字符串。 - 返回最后一个单词的长度。
举例:对于 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;
}
方法二:反向遍历检查空格
思路
从字符串末尾开始反向遍历。第一步:跳过末尾的所有空格,找到最后一个单词的结尾。第二步:继续反向遍历,直到遇到空格或到达字符串开头,统计单词长度。不需要额外空间,直接计算长度。
核心思想:反向遍历,先跳过空格再统计单词长度。
具体步骤:
- 从字符串末尾开始,跳过所有空格。
- 继续反向遍历,统计非空格字符数量。
- 遇到空格或到达开头时返回长度。
举例:对于 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