力扣58. 最后一个单词的长度

「这是我参与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%的用户

Guess you like

Origin juejin.im/post/7031538425799032845