给你一个字符串 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:从后往前遍历
思路:
我们要完成的任务是在两个位置做标记,第一个是最后一个单词的开头(记为pos1,初始化为0),第二个是在最后一个单词的结尾(记为pos2,初始化为0)。
我们可以选择从后往前遍历字符串,然后判断每个字符是否是非空格,遇到的第一个非空格字符,那么就是我们要寻找的第二个标记(pos2=i),继续往前遍历,去找我们的第一个标记,第一个标记有两种情况:
第一种是最后一个单词前边存在空格的时候,那么就是当遍历到的字符等于空格的时候,便是第一个标记的位置,例如"helle world"
第二种情况是整个句子只有一个单词,那么此时他也是最后一个单词,他的前边已经不存在空格,而是到达了数组的边界了,那么我们需要在字符串的边界做上标记。如“hello”
另一个比较重要的点是怎么实现保证先找第二个标记,再找第一个标记呢,我们可以用两个标记flag1、flag2来实现,分别代表第一个标记和第二个标记,如果flag2=true,表示当下正在寻找第二个标记,当寻找到第二个标记时,执行flag2=false;和flag1=true;表示当下正在寻找第一个标记。这样结合&&操作就可以实现顺序执行。
代码
class Solution {
public int lengthOfLastWord(String s) {
//把多个空格的地方全部换成一个空格
boolean flag1=true;
boolean flag2=false;
int pos1=0;
int pos2=0;
//从后往前遍历,直到遇到第一个非空格
for(int i=s.length()-1;i>=0;i--){
//确定结尾
if(!(s.charAt(i)==' ')&&flag1){
pos2=i;
flag1=false;
flag2=true;
}
//确定开头
if(s.charAt(i)==' '&&flag2){
pos1=i;
break;
}
//要考虑边界的情况
if(i==0&&flag2){
pos1=i-1;
break;
}
}
return pos2-pos1;
}
}
