LeetCode详解之如何一步步优化到最佳解法:14. 最长公共前缀

LeetCode详解系列的总目录(持续更新中):LeetCode详解之如何一步步优化到最佳解法:前100题目录(更新中...)-CSDN博客

LeetCode详解系列的上一题链接:LeetCode详解之如何一步步优化到最佳解法:13. 罗马数字转整数-CSDN博客

目录

14. 最长公共前缀

解法1:暴力解法

代码

解法性能

解法分析

解法2:最终版

代码

解法性能

解法分析


14. 最长公共前缀

本题题目链接:14. 最长公共前缀 - 力扣(LeetCode)

解法1:暴力解法

代码

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        the_result = ""
        for i, current_character in enumerate(strs[0]):
            for j, current_str in enumerate(strs):
                if len(current_str) < (i+1) or current_str[i] != current_character:
                    return the_result
            
            the_result += current_character
        
        return the_result

解法性能

解法分析

首先,了解题目中的给定条件是一件很重要的事。题目给出了三个提示,其中,第1个提示表明,这个strs列表至少含有一个字符串(注意:可能这仅有的字符串是空字符串);第2个提示表明,列表中任何一个字符串都有可能为空字符串;第3个提示表明,只要字符串不是空字符串的话,它就由小写字母组成。

然后,既然我们需要确定最长的公共前缀,那我们就从每一个字符串的第1个字符(第1列)开始,一个字符一个字符比较(可以理解为一种纵向比较,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同),对应的代码如下所示:

for i, current_character in enumerate(strs[0]):
    for j, current_str in enumerate(strs):

若某一个字符串当前列的字符和之前所有的字符串当前列的字符不一样时,当前所存储的公共前缀就是最长的公共前缀;若是这一列遍历完,则将这一列对应的字符添加到我们存储的公共前缀变量”the_result”中。当然,这里面有一个要注意的点,就是对于我们正在比较的第i列,不是每一个字符串都有第i列的(即某些字符串的字符数小于等于i),在这种情况下,我们直接返回当前所存储的公共前缀即可。这一部分对应的代码为:

for i, current_character in enumerate(strs[0]):
    for j, current_str in enumerate(strs):
        if len(current_str) < (i+1) or current_str[i] != current_character:
            return the_result
    
    the_result += current_character

如果我们遍历完所有的列后,还是没有提前退出函数的话,则当前所存储的公共前缀就是最长的公共前缀。

接着,我们看看有哪些地方可以被优化的。首先,如果满足一些条件的话,可以提前退出。比如,如果列表strs只有1个字符串的话,则仅有的字符串就是最长的公共前缀(不管是不是空字符串,都是最长的公共前缀);还有,若是有空的字符串的话,也可以提前退出,返回空字符串。第二点可以优化的地方是解法1代码中的”len(current_str)”部分,我们可以看到”len(current_str)”这个计算是在for循环”for i, current_character in enumerate(strs[0]):”里面的,所以,除了第一个字符串以外的所有字符串,平均下来,其长度几乎都被算了很多遍(虽然,python也许对这块有优化)。这是一个可以节省时间的点,尤其是输入的列表中元素很多的情况下。我们可以提前将所有字符串的长度计算一遍并存储下来,方便我们在后面使用最短的时间来查询。

经过上面3点的优化,我们可以得到下面的解法:

解法2:最终版

代码

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        the_result = ""
        if len(strs) == 1:
            return strs[0]
        
        all_length = []
        for current_str in strs:
            if len(current_str) != 0:
                all_length.append(len(current_str))
            else:
                return the_result

        for i, current_character in enumerate(strs[0]):
            for j, current_str in enumerate(strs):
                if all_length[j] < (i+1) or current_str[i] != current_character:
                    return the_result
            
            the_result += current_character
        
        return the_result

解法性能

 

解法分析

从上面的代码中,我们可以看到,首先,我们对只有一个字符串的情况进行了单独的处理。然后,我们使用一个列表”all_length”来记录所有字符串的长度,如果在记录的过程中,发现某一个字符串为空字符串的话,提前结束,直接返回空字符串。最后的嵌套for循环则和前面相似,只是不需要每次再计算一下当前字符串的长度了。

最后,前100题中,大家如果对哪些题目的详解比较感兴趣,可以在评论区留言,我会优先更新这些题目(我会优先选择简单和中等难度的题目),感谢大家的支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/978451.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用VS Code远程开发OpenAI API

由于OpenAI的API在国内不可用&#xff0c;我们要针对API进行开发困难比较大。 如果你有一个能使用OpenAI API的Linux服务器&#xff0c;我们可以方便地使用VS Code的远程开发功能来解决这个问题。 如果没有&#xff0c;你也可以试试获得一个免费的国外服务器&#xff0c;网上有…

代码审计入门学习

简介 HadSky轻论坛程序为个人原创PHP系统&#xff0c;作者为蒲乐天&#xff0c;后端基于puyuetianPHP框架驱动&#xff0c;前端基于 puyuetianUI框架驱动&#xff0c;默认编辑器为puyuetianEditor富文本编辑器&#xff0c;其他非原创框架及驱动JQuery.js 及Font-Awesome字体库…

Java线程池入门03

1. 这3种创建线程池的方式有风险 FixedThreadPool : 固定大小的线程池SingleThreadExecutor : 单个线程的线程池CachedThreadPool : 可缓存的线程池 FixedThreadPool内部其实也是使用ThreadPoolExecutor来创建的 等价于 : new ThreadPoolExecutor(nThreads, nThreads, 0L, Tim…

C#连接sql server

连接时&#xff0c;出现如下提示&#xff1a; ERROR [IM014] [Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中&#xff0c;驱动程序和应用程序之间的体系结构不匹配 原因是odbc的驱动和应用程序的架构不一致。我的odbc如下所示&#xff1a; 显示为64位&#xff0c;而c#程序显…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.1.2典型应用场景:日志分析、实时搜索、推荐系统

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 为什么选择Elasticsearch&#xff1f;——典型应用场景深度解析1. 引言2. 日志分析&#xff1a;海量数据的实时洞察2.1 行业痛点2.2 ES解决方案关键技术实现&#xff1a; 2.…

SQLite 安装教程以及可视化工具介绍

目录 简述 1. Windows 系统安装 1.1 下载预编译的二进制文件 1.2 解压文件 1.3 配置环境变量 1.4 验证安装 2. GUI 可视化工具 2.1 免费工具 2.1.1 DB Browser for SQLite 2.1.2 SQLiteStudio 2.1.3 SQLite Expert 2.1.4 SQLiteGUI 2.1.5 Antares SQL 2.1.6 DbGa…

C#快速调用DeepSeek接口,winform接入DeepSeek查询资料 C#零门槛接入DeepSeek C#接入DeepSeek源代码下载

下载地址<------完整源码 在数字化转型加速的背景下&#xff0c;企业应用系统对智能服务的需求日益增长。DeepSeek作为先进的人工智能服务平台&#xff0c;其自然语言处理、图像识别等核心能力可显著提升业务系统的智能化水平。传统开发模式下&#xff0c;C#开发者需要耗费大…

IP------PPP协议

这只是IP的其中一块内容PPP&#xff0c;IP还有更多内容可以查看IP专栏&#xff0c;前一章内容为网络类型&#xff0c;可通过以下路径查看IP---网络类型-CSDN博客&#xff0c;欢迎指正 3.PPP协议 1.PPP优点 网络类型&#xff1a;p2p PPP---点到点协议 兼容性会更强凡是接口或…

山东大学软件学院ai导论实验之生成对抗网络

目录 实验目的 实验代码 实验内容 实验结果 实验目的 基于Pytorch搭建一个生成对抗网络&#xff0c;使用MNIST数据集。 实验代码 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data…

【Java 面试 八股文】JVM 虚拟机篇

JVM 虚拟机篇 1. JVM组成1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f;1.2 什么是程序计数器&#xff1f;1.3 你能给我详细的介绍Java堆吗?1.4 Java 虚拟机栈1.4.1 Java Virtual machine Stacks (java 虚拟机栈)1.4.2 栈和堆的区别1.4.3 垃圾回收是否涉及栈内…

钉钉MAKE AI生态大会思考

1. 核心特性 1.1 底层模型开放 除原有模型通义千问外,新接入猎户星空、智普、MinMax、月之暗面、百川智能、零一万物。 1.2 AI搜索 AI搜索贯通企业和个人散落在各地的知识(聊天记录、文档、会议、日程、知识库、项目等),通过大模型对知识逻辑化,直接生成搜索的答案,并…

flex布局自定义一行几栏,靠左对齐===grid布局

模板 <div class"content"><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"…

当下弹幕互动游戏源码开发教程及功能逻辑分析

当下很多游戏开发者或者想学习游戏开发的人&#xff0c;想要了解如何制作弹幕互动游戏&#xff0c;比如直播平台上常见的那种&#xff0c;观众通过发送弹幕来影响游戏进程。需要涵盖教程的步骤和功能逻辑的分析。 首先&#xff0c;弹幕互动游戏源码开发教程部分应该分步骤&…

jdk21下载、安装(Windows、Linux、macOS)

Windows 系统 1. 下载安装 访问 Oracle 官方 JDK 下载页面 或 OpenJDK 下载页面&#xff0c;根据自己的系统选择合适的 Windows 版本进行下载&#xff08;通常选择 .msi 安装包&#xff09;。 2. 配置环境变量 右键点击 “此电脑”&#xff0c;选择 “属性”。 在左侧导航栏…

2.部署kafka:9092

官方文档&#xff1a;http://kafka.apache.org/documentation.html (虽然kafka中集成了zookeeper,但还是建议使用独立的zk集群) Kafka3台集群搭建环境&#xff1a; 操作系统: centos7 防火墙&#xff1a;全关 3台zookeeper集群内的机器&#xff0c;1台logstash 软件版本: …

VUE向外暴露文件,并通过本地接口调用获取,前端自己生成接口获取public目录里面的文件

VUE中&#xff0c;如果我们想对外暴露一个文件&#xff0c;可以在打包之后也能事实对其进行替换&#xff0c;我们只需要把相关文件放置在public目录下即可&#xff0c;可以放置JSON&#xff0c;Excel等文件 比如我在这里放置一个other文件 我们可以直接在VUE中使用axios去获取…

ubuntu-24.04.1-desktop 中安装 QT6.7

ubuntu-24.04.1-desktop 中安装 QT6.7 1 环境准备1.1 安装 GCC 和必要的开发包:1.2 Xshell 连接 Ubuntu2 安装 Qt 和 Qt Creator:2.1 下载在线安装器2.2 在虚拟机中为文件添加可执行权限2.3 配置镜像地址运行安装器2.4 错误:libxcb-xinerama.so.0: cannot open shared objec…

应用的负载均衡

概述 负载均衡&#xff08;Load Balancing&#xff09; 调度后方的多台机器&#xff0c;以统一的接口对外提供服务&#xff0c;承担此职责的技术组件被称为“负载均衡”。 负载均衡器将传入的请求分发到应用服务器和数据库等计算资源。负载均衡是计算机网络中一种用于优化资源利…

Linux: 已占用接口

Linux: 已占用接口 1. netstat&#xff08;适用于旧系统&#xff09;1.1 书中对该命令的介绍 2. ss&#xff08;适用于新系统&#xff0c;替代 netstat&#xff09;3. lsof&#xff08;查看详细进程信息&#xff09;4. fuser&#xff08;快速查找占用端口的进程&#xff09;5. …

组件注册方式、传递数据

组件注册 一个vue组件要先被注册&#xff0c;这样vue才能在渲染模版时找到其对应的实现。有两种注册方式&#xff1a;全局注册和局部注册。&#xff08;组件的引入方式&#xff09; 以下这种属于局部引用。 组件传递数据 注意&#xff1a;props传递数据&#xff0c;只能从父…