【经典算法】LeetCode 58.最后一个单词的长度(Java/C/Python3/Go实现含注释说明,Easy)

简介: 【经典算法】LeetCode 58.最后一个单词的长度(Java/C/Python3/Go实现含注释说明,Easy)
  • 作者简介:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名
  • ❤️觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论,💬支持博主,记得点个大大的关注,持续更新🤞
    ————————————————-

题目描述

给定一个字符串 s,找到 s 中最后一个单词的长度。单词以空格 ' ' 分隔。

原题:LeetCode 58

思路及实现

方式一:从后向前遍历

思路

直接从字符串的末尾开始向前遍历,跳过空格,直到遇到第一个非空格字符,然后计数直到再次遇到空格或到达字符串的开头。

代码实现

Java版本
public class Solution {
    public int lengthOfLastWord(String s) {
        int length = 0;
        int i = s.length() - 1;
        
        // 跳过末尾的空格
        while (i >= 0 && s.charAt(i) == ' ') {
            i--;
        }
        
        // 计数最后一个单词的长度
        while (i >= 0 && s.charAt(i) != ' ') {
            length++;
            i--;
        }
        
        return length;
    }
}

说明:Java代码通过两个循环,第一个循环跳过末尾的空格,第二个循环从最后一个非空格字符开始向前计数直到遇到空格或字符串的开头。

C语言版本
#include <string.h>
int lengthOfLastWord(char *s) {
    int length = 0;
    int i = strlen(s) - 1;
    
    // 跳过末尾的空格
    while (i >= 0 && s[i] == ' ') {
        i--;
    }
    
    // 计数最后一个单词的长度
    while (i >= 0 && s[i] != ' ') {
        length++;
        i--;
    }
    
    return length;
}

说明:C语言版本的代码和Java版本逻辑相同,只是语言语法上有所区别。

Python3版本
def lengthOfLastWord(s: str) -> int:
    # 去除字符串末尾的空格
    s = s.rstrip()
    # 以空格分割字符串,并取最后一个单词
    last_word = s.split()[-1]
    # 返回最后一个单词的长度
    return len(last_word)

说明:Python版本利用字符串的rstrip方法去除末尾的空格,然后使用split方法按空格分割字符串,并取最后一个单词返回其长度。

Golang版本
package main
import (
  "strings"
)
func lengthOfLastWord(s string) int {
  // 去除字符串末尾的空格
  s = strings.TrimRight(s, " ")
  // 以空格分割字符串,并取最后一个单词
  words := strings.Split(s, " ")
  lastWord := words[len(words)-1]
  // 返回最后一个单词的长度
  return len(lastWord)
}
func main() {
  // 测试代码
  s := "Hello World"
  length := lengthOfLastWord(s)
  println(length) // 输出: 5
}

说明:Golang版本使用strings包中的TrimRight函数去除末尾的空格,然后使用Split函数按空格分割字符串,并取最后一个单词返回其长度。

复杂度分析

  • 时间复杂度:O(n),其中n是字符串的长度。因为我们需要遍历整个字符串来找到最后一个单词的长度。
  • 空间复杂度:
  • Java, C, Golang版本:O(1),因为我们只使用了常量级的额外空间。
  • Python版本:O(k),其中k是最后一个单词的长度,因为split函数会创建一个包含所有单词的列表。

方式二:正则表达式

思路

使用正则表达式来匹配并获取最后一个单词,然后返回其长度。

代码实现

Java版本
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Solution {
    public int lengthOfLastWord(String s) {
        // 正则表达式匹配单词,\b表示单词边界,\w+匹配一个或多个字母、数字或下划线
        Pattern pattern = Pattern.compile("\\b\\w+\\b");
        Matcher matcher = pattern.matcher(s);
        
        int length = 0;
        // 查找所有匹配项
        while (matcher.find()) {
            // 保留最后一个匹配项的长度
            length = matcher.group().length();
        }
        
        return length;
    }
}

说明:Java版本使用PatternMatcher类来编译和匹配正则表达式。\\b\\w+\\b正则表达式匹配单词边界内的单词。在循环中,我们不断查找匹配项,并保留最后一个匹配项的长度。

C语言版本

C语言标准库并不直接支持正则表达式,因此通常需要使用第三方库如POSIX正则表达式库(regex.h)或PCRE库。这里以POSIX正则表达式库为例进行演示。

首先,确保你的系统支持POSIX正则表达式库,并且你的编译器链接了该库。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
int lengthOfLastWord(char *s) {
    regex_t regex;
    regmatch_t match;
    int ret;
    char errbuf[100];
    
    // 编译正则表达式,匹配单词边界内的单词
    ret = regcomp(&regex, "\\b\\w+\\b", REG_EXTENDED);
    if (ret) {
        regerror(ret, &regex, errbuf, sizeof(errbuf));
        fprintf(stderr, "Regex compilation failed: %s\n", errbuf);
        return 0;
    }
    
    int length = 0;
    char *ptr = s;
    // 查找所有匹配项
    while ((ret = regexec(&regex, ptr, 1, &match, 0)) == 0) {
        // 如果找到匹配项,更新长度为当前匹配项的长度
        length = match.rm_eo - match.rm_so;
        // 移动指针到下一个可能的位置
        ptr += match.rm_eo;
    }
    
    // 释放正则表达式对象
    regfree(&regex);
    
    // 如果正则表达式执行失败且不是因为没有更多匹配项,打印错误信息
    if (ret != REG_NOMATCH) {
        regerror(ret, &regex, errbuf, sizeof(errbuf));
        fprintf(stderr, "Regex match failed: %s\n", errbuf);
    }
    
    return length;
}
int main() {
    char s[] = "Hello World";
    int length = lengthOfLastWord(s);
    printf("Length of last word: %d\n", length); // 输出: 5
    return 0;
}

说明:C语言版本使用POSIX的regex.h库来编译和匹配正则表达式。注意,编译时需要链接正则表达式库(通常是使用-lregex选项)。正则表达式的使用和Java版本类似,但在C语言中需要手动管理字符串指针来迭代查找匹配项。

Python3版本
import re
def lengthOfLastWord(s: str) -> int:
    # 使用正则表达式匹配最后一个单词
    last_word = re.search(r'\b\w+\b$', s)
    # 如果找到最后一个单词,返回其长度,否则返回0
    return len(last_word.group()) if last_word else 0
Golang版本

Golang的正则表达式库功能强大且易于使用。

package main
import (
  "fmt"
  "regexp"
)
func lengthOfLastWord(s string) int {
  // 编译正则表达式,匹配单词边界内的单词
  re := regexp.MustCompile(`\b\w+\b`)
  // 查找所有匹配项
  matches := re.FindAllString(s, -1)
  // 如果找到匹配项,返回最后一个匹配项的长度
  if len(matches) > 0 {
    return len(matches[len(matches)-1])
  }
  // 如果没有找到匹配项,返回0
  return 0
}
func main() {
  s := "Hello World"
  length := lengthOfLastWord(s)
  fmt.Println(length) // 输出: 5
}

复杂度分析:

  • 时间复杂度:O(n),其中n是字符串s的长度。Golang的正则表达式引擎同样会遍历整个字符串来查找匹配项。
  • 空间复杂度:O(k),其中k是匹配到的单词数量。和Java和C语言版本类似,理论空间复杂度与匹配到的单词数量成正比。但实际上,由于我们只关心最后一个单词的长度,因此空间复杂度可以视为O(1)。

总结

方式 优点 缺点 时间复杂度 空间复杂度
方式一(字符串分割) 1. 不依赖正则表达式库,实现相对独立。 1. 代码量较大,实现逻辑较复杂。 O(n) O(n)
方式二(正则表达式) 1. 代码简洁,易于理解。 1. 依赖正则表达式库,可能不是性能最优解。 O(n) O(1)

相似题目

相似题目 难度 链接
LeetCode 58 - 最后一个单词的长度 简单 LeetCode 58
LeetCode 151 - 翻转字符串里的单词 中等 LeetCode 151
LeetCode 434 - 字符串中的单词数 简单 LeetCode 434
LeetCode 14 - 最长公共前缀 简单 LeetCode 14
LeetCode 647 - 回文子串 中等 LeetCode 647
LeetCode 459 - 重复的子字符串 困难 LeetCode 459
LeetCode 5 - 最长回文子串 中等 LeetCode 5

这些题目涵盖了字符串处理的不同方面,从简单的字符串操作到复杂的回文串检测,通过解决这些题目,可以加深对字符串处理的理解和提高相关技能。

欢迎一键三连(关注+点赞+收藏),技术的路上一起加油!!!代码改变世界

  • 关于我:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法公众号同名),回复暗号,更能获取学习秘籍和书籍等
相关文章
|
19天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
212 55
|
7天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
102 66
|
29天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
155 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
4天前
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
32 12
|
11天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
49 20
|
4天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
9天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
41 5
|
9天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
43 0
|
10天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
143 80
|
3天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。