最后一个单词的长度

标签: 字符串

难度: Easy

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

Submission

运行时间: 36 ms

内存: 14.9 MB

class Solution:
    def lengthOfLastWord(self, s: str) -> int:
        s = s.strip()
        i = len(s) - 1
        ans = 0
        while i >= 0 and s[i] != " ":
            ans += 1
            i -= 1
        
        return ans

Explain

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

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def lengthOfLastWord(self, s: str) -> int:
        s = s.strip()  # 去除字符串两端的空格
        i = len(s) - 1  # 初始化指针 i 指向字符串的末尾
        ans = 0  # 初始化最后一个单词的长度为 0
        while i >= 0 and s[i] != " ":  # 从字符串末尾开始向前遍历,直到遇到空格或到达字符串开头
            ans += 1  # 非空格字符计数加 1
            i -= 1  # 指针前移
        
        return ans  # 返回最后一个单词的长度

Explore

使用strip()方法去除字符串两端的空格是为了防止字符串前后的空格影响最后一个单词的定位。例如,如果字符串尾部有空格,直接从后向前遍历时,这些空格会被错误地计算为单词的一部分,导致结果不正确。去除这些空格后,可以确保从字符串末尾开始的第一个非空字符直接是最后一个单词的一部分,从而准确计算其长度。

如果字符串s的结尾不是空格而是直接结束于一个单词,算法的逻辑并不需要改变。strip()方法依然会被调用以处理可能存在的前端空格,但对于字符串末尾没有空格的情况,strip()不会做任何改变。算法仍然从字符串的末尾开始计数,直到遇到空格或到达字符串的开头,这样可以正确计算最后一个单词的长度。

这种条件设置可以有效处理字符串开头即是单词的情况。条件i >= 0确保了遍历不会越界,即指针不会移动到字符串的起始位置之前。条件s[i] != ' '保证了只有遇到空格时才停止计数,这意味着如果字符串从第一个字符就开始是单词,遍历将继续进行直到字符串的起点,从而正确统计这个单词的长度。

在这个问题中,从末尾开始向前遍历的主要优势是可以直接定位到最后一个单词并开始计数,这是因为我们只关心最后一个单词的长度。如果从前向后遍历,我们需要遍历整个字符串以确定所有单词的位置,并额外使用标记或计数器追踪最后一个单词的位置和长度,这增加了算法的复杂性和可能的错误点。从末尾向前遍历直接简化了这一过程,提高了效率。