【力扣】58. 最后一个单词的长度 反向遍历解题是不是最优解?

4,265 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

春招打卡第22天第30篇。

勤学似春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏。

掘金的活动真多哇,这个月决定每天用go刷题,一方面提升一下算法水平,另一方面沉淀一下go语言的学习。

Let's GO!

题目描述

给你一个字符串 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 <= 10410^{4}

s 仅有英文字母和空格 ' ' 组成

s 中至少存在一个单词

题目分析

  1. 看完题目描述第一反应就是将字符串根据空格切分成数组
  2. 获得数组中最后一个单词的长度就是我们需要的长度
  3. 但是上述这种方式不是最优解,既然是要找最后一个单词的长度,我们可以使用反向遍历的思路

思路讲解

  1. 根据题意可以知道字符串中至少存在一个单词,因此字符串中一定有字母。
  2. 首先找到字符串中的最后一个字母,这个字母就是最后一个单词的最后一个字母。
  3. 从最后一个字母开始继续反向遍历字符串,直到遇到空格或者到达字符串的起始位置。
  4. 遍历到的每个字母都是最后一个单词中的字母,因此遍历到的字母数量就是最后一个单词的长度了。

AC代码

func lengthOfLastWord(s string) (ans int) {
    //倒序遍历 获得最大索引位置
    index := len(s) - 1
    for s[index] == ' ' {
        index--
    }
    //倒序索引未跑完并且索引对应的值不是空字符串时
    for index >= 0 && s[index] != ' ' {
        ans++
        index--
    }
    return
}

运行结果

image.png

总结

复杂度分析:

时间复杂度:O(n),其中 n 是字符串的长度。

空间复杂度:O(1)。

来源说明

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/le…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

最后

感谢阅读,欢迎大家三连:点赞、收藏、投币(关注)!!!

8e95dac1fd0b2b1ff51c08757667c47a.gif