「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」
描述
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
- 示例 1:
输入:s = "Hello World"
输出:5
复制代码
- 示例 2:
输入:s = " fly me to the moon "
输出:4
复制代码
- 示例3
输入:s = "luffy is still joyboy"
输出:6
复制代码
- 提示:
1 <= s.length <= 104
s
仅有英文字母和空格' '
组成s
中至少存在一个单词
解析
根据题意:一个字符串,空格分隔,求最后字符串长度。 分析可知,由于字符串中至少存在一个单词,因此字符串中一定有字母。首先找到字符串中的最后一个字母,该字母即为最后一个单词的最后一个字母。
从最后一个字母开始继续反向遍历字符串,直到遇到空格或者到达字符串的起始位置。遍历到的每个字母都是最后一个单词中的字母,因此遍历到的字母数量即为最后一个单词的长度。
复杂度:
- 时间复杂度:O(n),其中 n 是字符串的长度。最多需要反向遍历字符串一次。
- 空间复杂度:O(1)。
示例
class Solution {
public int lengthOfLastWord(String s) {
if (s.length() == 0) { return 0; }
int res = 0;
// hasMetSpace:从后往前遇到了一个单词之后是否还遇到过空格(即单词之间的空格)
// hasMetWord:从后往前是否遇到过单词
boolean hasMetSpace = false, hasMetWord = false;
for (int i = s.length() - 1; i >= 0; --i) {
if (s.charAt(i) == ' ' && hasMetWord) {
// 如果已遇到过单词,然后又约到了空格,说明遇到了单词之间的空格
hasMetSpace = true;
}
if (s.charAt(i) != ' ' && !hasMetSpace) {
// 如果遇到了有效字符但是没遇到过单词之间的空格,
// 说明这个字符属于最后一个单词
hasMetWord = true;
++res;
}
}
return res;
}
}
复制代码
解法二:
class Solution {
public int lengthOfLastWord(String s) {
int l = s.length()-1;
while(l>=0 && s.charAt(l) == ' '){
l--;
}
int i = 0;
while( l>=0 && s.charAt(l) != ' '){
i++;
l--;
}
return i;
}
}
复制代码
运行结果:
执行结果:通过
执行用时:1 ms, 在所有 Java 提交中击败了73.21%的用户
内存消耗:37.1 MB, 在所有 Java 提交中击败了87.2%的用户