leetcode
leetcode 51 ~ 100
最后一个单词的长度

最后一个单词的长度

难度:

标签:

题目描述

给你一个字符串 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 中至少存在一个单词

代码结果

运行时间: 36 ms, 内存: 14.9 MB


/*
 * 题目思路:
 * 使用Java Stream API来解决该问题。
 * 我们将字符串按空格分割为单词流,并过滤掉空字符串。
 * 然后找到最后一个单词并返回其长度。
 */
import java.util.Arrays;
 
public class Solution {
    public int lengthOfLastWord(String s) {
        return Arrays.stream(s.split(" "))
                     .filter(word -> !word.isEmpty())
                     .reduce((first, second) -> second) // 获取最后一个单词
                     .map(String::length)
                     .orElse(0); // 返回最后一个单词的长度
    }
}

解释

方法:

该题解的思路如下:首先使用 strip() 方法去除字符串两端的空格,然后从字符串的末尾开始向前遍历,记录非空格字符的个数,直到遇到空格或到达字符串的开头为止。最后返回记录的非空格字符个数即为最后一个单词的长度。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么在计算最后一个单词的长度之前,需要使用strip()方法去除字符串两端的空格?
使用strip()方法去除字符串两端的空格是为了防止字符串前后的空格影响最后一个单词的定位。例如,如果字符串尾部有空格,直接从后向前遍历时,这些空格会被错误地计算为单词的一部分,导致结果不正确。去除这些空格后,可以确保从字符串末尾开始的第一个非空字符直接是最后一个单词的一部分,从而准确计算其长度。
🦆
如果字符串s的结尾不是空格,而是直接结束于一个单词,这种情况下算法的逻辑是否有所不同?
如果字符串s的结尾不是空格而是直接结束于一个单词,算法的逻辑并不需要改变。strip()方法依然会被调用以处理可能存在的前端空格,但对于字符串末尾没有空格的情况,strip()不会做任何改变。算法仍然从字符串的末尾开始计数,直到遇到空格或到达字符串的开头,这样可以正确计算最后一个单词的长度。
🦆
在while循环中,使用了条件i >= 0和s[i] != ' ',这种条件的设置是否能有效处理字符串开头即是单词的情况?
这种条件设置可以有效处理字符串开头即是单词的情况。条件i >= 0确保了遍历不会越界,即指针不会移动到字符串的起始位置之前。条件s[i] != ' '保证了只有遇到空格时才停止计数,这意味着如果字符串从第一个字符就开始是单词,遍历将继续进行直到字符串的起点,从而正确统计这个单词的长度。
🦆
请问在遍历字符串时,从末尾开始向前遍历与从前向后遍历在处理这个问题上有什么不同的优势?
在这个问题中,从末尾开始向前遍历的主要优势是可以直接定位到最后一个单词并开始计数,这是因为我们只关心最后一个单词的长度。如果从前向后遍历,我们需要遍历整个字符串以确定所有单词的位置,并额外使用标记或计数器追踪最后一个单词的位置和长度,这增加了算法的复杂性和可能的错误点。从末尾向前遍历直接简化了这一过程,提高了效率。

相关问题