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
解释:最后一个单词是"joyboy",长度为6。

提示:

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

解题思路

这道题要求返回字符串中最后一个单词的长度,有几种解法思路:

方法一:从右往左扫描(推荐) 从字符串末尾开始向左扫描,首先跳过末尾的空格,然后统计最后一个单词的字符个数。这种方法只需要一次遍历,且遍历长度可能小于字符串总长度。

方法二:字符串分割 使用语言内置的字符串分割函数,将字符串按空格分割成单词数组,然后返回最后一个单词的长度。这种方法代码简洁,但空间复杂度较高。

方法三:从左往右扫描 从左到右遍历整个字符串,记录当前单词长度,遇到空格时重置计数器,最终返回最后记录的单词长度。

从时间和空间效率考虑,**方法一(从右往左扫描)**是最优解法。它避免了创建额外的数据结构,且在最坏情况下的遍历长度也相对较小。

代码实现

class Solution {
public:
    int lengthOfLastWord(string s) {
        int i = s.length() - 1;
        int length = 0;
        
        // 跳过末尾的空格
        while (i >= 0 && s[i] == ' ') {
            i--;
        }
        
        // 统计最后一个单词的长度
        while (i >= 0 && s[i] != ' ') {
            length++;
            i--;
        }
        
        return length;
    }
};
class Solution:
    def lengthOfLastWord(self, s: str) -> int:
        i = len(s) - 1
        length = 0
        
        # 跳过末尾的空格
        while i >= 0 and s[i] == ' ':
            i -= 1
        
        # 统计最后一个单词的长度
        while i >= 0 and s[i] != ' ':
            length += 1
            i -= 1
        
        return length
public class Solution {
    public int LengthOfLastWord(string s) {
        int i = s.Length - 1;
        int length = 0;
        
        // 跳过末尾的空格
        while (i >= 0 && s[i] == ' ') {
            i--;
        }
        
        // 统计最后一个单词的长度
        while (i >= 0 && s[i] != ' ') {
            length++;
            i--;
        }
        
        return length;
    }
}
var lengthOfLastWord = function(s) {
    let i = s.length - 1;
    let length = 0;
    
    // 跳过末尾的空格
    while (i >= 0 && s[i]

复杂度分析

复杂度类型复杂度说明
时间复杂度O(n)最坏情况下需要遍历整个字符串,其中 n 为字符串长度
空间复杂度O(1)只使用了常数个额外变量