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^4s仅有英文字母和空格' '组成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) | 只使用了常数个额外变量 |