LeetCode58、最后一个单词的长度

105 阅读1分钟

LeetCode 系列记录我学习算法的过程。

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

题目

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

示例:

输入: s = "Hello World"
输出: 5
解释: 最后一个单词是“World”,长度为5。


输入: s = "   fly me   to   the moon  "
输出: 4 解释: 最后一个单词是“moon”,长度为4。


输入: s = "luffy is still joyboy"
输出: 6
解释: 最后一个单词是长度为6的“joyboy”。

提示

  • 1 <= s.length <= 104
  • s 仅有英文字母和空格 ' ' 组成
  • s 中至少存在一个单词

思路

题目要求获取最后一个单词的长度,那么想到的第一个办法就是从后往前遍历,将记录的长度返回即可

但是要区分两种情况,一种是尾部没有空格,那遍历到空格或遍历到头部即可

尾部有空格则跳过空格从遇到的第一个字母开始

  • 定义 size 记录长度,reg 匹配字母
  • 从后往前对字符串 s 进行遍历
  • 结束循环条件为记录长度大于 0,且当前字符不为字母时
  • 反之当前字符为字母时,长度加一
  • 全部遍历完则返回记录长度即可

代码实现

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLastWord = function(s) {
    // size记录长度,reg匹配字符
    let size = 0, reg = /^[a-zA-Z]$/
    // 从后往前遍历字符串
    for(let i = s.length - 1; i >= 0; i--) {
        // 当记录长度大于0,且当前字符不为字母时,返回记录长度
        if(size > 0 && !reg.test(s[i])) return size
        // 当当前字符为字母时,长度加一
        if(reg.test(s[i])) size++
    }
    // 最后返回长度
    return size
};

image.png

优化

还可以先将尾部空格全部跳过,然后再遍历字符串:

var lengthOfLastWord = function(s) {
    let size = 0, i = s.length - 1
    // 跳过空字符
    while (s[i] === ' ') i--
    // 遍历字符串,遇到空格或遍历到头部则结束遍历
    while (i >= 0 && s[i] !== ' ') {
        i--
        size++
    }
    // 返回最后记录的长度
    return size
};