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 <= 104s仅有英文字母和空格' '组成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
};
优化
还可以先将尾部空格全部跳过,然后再遍历字符串:
var lengthOfLastWord = function(s) {
let size = 0, i = s.length - 1
// 跳过空字符
while (s[i] === ' ') i--
// 遍历字符串,遇到空格或遍历到头部则结束遍历
while (i >= 0 && s[i] !== ' ') {
i--
size++
}
// 返回最后记录的长度
return size
};