[每日一题] 58. 最后一个单词的长度

链接:Leetcode

难度等级: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
解释:最后一个单词是长度为6的“joyboy”。

思路:从前往后依次遍历字符串的字符。维护一个变量curLen记录当前单词的长度,维护一个变量LastLen记录上一个单词的长度。若当前字符为空格,且curLen不为0,表示前一个位置为单词的结束。将LastLen赋值为curLen的值,同时将curLen置0;若当前字符不是空格,说明该单词仍未结束,则curLen自增1。

当整个字符串遍历完后,判断curLen是否为0。若其为0,则表示最后字符串最后不是空格,直接返回curLen;若curLen表示最后为空格,则返回LastLen。

时间复杂度:O(N)

空间复杂度:O(1)

class Solution {
    fun lengthOfLastWord(s: String): Int {
        var curLen = 0
        var lastLen = 0
        for (pos in 0 until s.length) {
            var curChar = s.get(pos)
            if (curChar == ' ' && curLen != 0) {
                lastLen = curLen
                curLen = 0
            } 
            
            if (curChar != ' ') {
                curLen++
            }
        }

        return if (curLen != 0) {
            curLen
        } else {
            lastLen
        }
    }
}

PS:看了LeetCode的官方解法,发现我的解法还是太蠢了,从后往前遍历会方便很多,贴一下官方的答案。

class Solution {
    public int lengthOfLastWord(String s) {
        int index = s.length() - 1;
        while (s.charAt(index) == ' ') {
            index--;
        }
        int wordLength = 0;
        while (index >= 0 && s.charAt(index) != ' ') {
            wordLength++;
            index--;
        }
        return wordLength;
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/length-of-last-word/solution/zui-hou-yi-ge-dan-ci-de-chang-du-by-leet-51ih/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
展示评论