一、题目描述
给你一个字符串 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 <= 10^4
s
仅有英文字母和空格' '
组成s
中至少存在一个单词
二、解题思路
- 首先,我们需要遍历字符串
s
,跳过所有开头的空格字符。 - 接下来,我们需要找到最后一个单词的开始位置。我们可以通过找到第一个非空格字符来实现。
- 一旦找到最后一个单词的开始位置,我们需要继续遍历字符串,直到遇到下一个空格字符或字符串的末尾。
- 计数从最后一个单词的开始位置到空格或字符串末尾之间的字符数量,这将是最后一个单词的长度。
三、具体代码
public class Solution {
public int lengthOfLastWord(String s) {
int length = s.length(); // 获取字符串的长度
int count = 0; // 初始化单词长度计数器
int lastWordStart = -1; // 初始化最后一个单词的起始位置
// 遍历字符串
for (int i = 0; i < length; i++) {
// 如果当前字符不是空格,并且上一个字符是空格,说明找到了单词的开始
if (s.charAt(i) != ' ' && lastWordStart == -1) {
lastWordStart = i;
}
// 如果当前字符是空格,并且上一个字符不是空格,说明单词已经结束
if (s.charAt(i) == ' ' && lastWordStart != -1) {
count = i - lastWordStart;
lastWordStart = -1; // 重置起始位置
}
}
// 如果字符串末尾是单词,没有被空格终止,需要特别处理
if (lastWordStart != -1) {
count = length - lastWordStart;
}
return count; // 返回最后一个单词的长度
}
}
四、时间复杂度和空间复杂度
1. 时间复杂度
- 时间复杂度是算法执行时间与输入数据量之间的关系。在这个例子中,我们使用了一个单层循环来遍历整个字符串
s
,循环的次数等于字符串的长度n
(即O(n)
)。 - 在循环中,我们执行的操作(如
charAt
和赋值操作)都是常数时间操作,即O(1)
。 - 因此,总的时间复杂度是
O(n)
,其中n
是输入字符串的长度。
2. 空间复杂度
- 空间复杂度是算法使用的存储空间与输入数据量之间的关系。在这个例子中,我们使用了三个额外的变量:
length
、count
和lastWordStart
。 - 这三个变量的空间需求不依赖于输入字符串的大小,它们都是固定大小的变量。
- 因此,空间复杂度是
O(1)
,即不随输入字符串的大小而变化。
五、总结知识点
-
字符串遍历:通过使用
for
循环和charAt
方法来遍历字符串中的每个字符。 -
条件判断:使用
if
语句来进行条件判断,根据不同的条件执行不同的代码块。 -
变量初始化:初始化变量
count
和lastWordStart
用于记录单词的长度和最后一个单词的起始位置。 -
逻辑运算:在条件判断中使用了逻辑与
&&
来确保两个条件都满足时才执行代码块。 -
处理特殊情况:代码中特别处理了字符串末尾是单词且没有被空格终止的情况。
-
字符串长度获取:使用
length
方法获取字符串的长度。 -
计数器:使用
count
变量来计数最后一个单词的长度。 -
重置变量:在遇到空格时,通过将
lastWordStart
设置为-1
来重置最后一个单词的起始位置。 -
返回值:方法的返回值是最后一个单词的长度。
-
边界条件处理:代码考虑了字符串可能以空格结尾的情况,以及可能没有空格只有单词的情况。
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。