58. 最后一个单词的长度
题目描述
输入字符串 s,它只由英文字母和空格组成。单词是一段连续的字母,两侧是空格或字符串边界。单词之间可能隔着多个空格,开头和结尾也可能有空格。
返回 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^4s只含英文字母和空格' '。s里至少有一个单词。
解题思路
从右往左反向扫描,分两段。第一段跳过末尾的空格,让 i 停在最后一个单词的最后一个字母上。第二段继续向左数非空格字符,遇到空格或走出字符串就停,数到的就是答案。
为什么正确
第二段循环中,s[i+1 : i+1+length] 全是字母,属于最后一个单词。
复杂度分析
时间 O(尾部空格数 + 最后一个单词长度),最坏 O(n);空间 O(1)。
易错点
尾部可能有空格,不能一上来就数;字符串也可能只有一个单词,第二段循环必须检查 i >= 0,否则会越界(Python 中 s[-1] 还会惄悄绕回末尾)。
参考代码
Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。
class Solution:
def lengthOfLastWord(self, s: str) -> int:
i = len(s) - 1
while i >= 0 and s[i] == ' ':
i -= 1
length = 0
while i >= 0 and s[i] != ' ':
length += 1
i -= 1
return lengthclass Solution {
public int lengthOfLastWord(String s) {
int i = s.length() - 1;
while (i >= 0 && s.charAt(i) == ' ') {
i--;
}
int length = 0;
while (i >= 0 && s.charAt(i) != ' ') {
length++;
i--;
}
return length;
}
}class Solution {
public:
int lengthOfLastWord(string s) {
int i = (int)s.size() - 1;
while (i >= 0 && s[i] == ' ') {
i--;
}
int length = 0;
while (i >= 0 && s[i] != ' ') {
length++;
i--;
}
return length;
}
};func lengthOfLastWord(s string) int {
i := len(s) - 1
for i >= 0 && s[i] == ' ' {
i--
}
length := 0
for i >= 0 && s[i] != ' ' {
length++
i--
}
return length
}var lengthOfLastWord = function(s) {
let i = s.length - 1;
while (i >= 0 && s[i] === ' ') {
i--;
}
let length = 0;
while (i >= 0 && s[i] !== ' ') {
length++;
i--;
}
return length;
};function lengthOfLastWord(s: string): number {
let i = s.length - 1;
while (i >= 0 && s[i] === ' ') {
i--;
}
let length = 0;
while (i >= 0 && s[i] !== ' ') {
length++;
i--;
}
return length;
}