【Leetcode刷题】算法:最长公共前缀

news2025/1/9 16:51:02

文章目录

  • 一、题目描述
  • 二、解题思路
    • 2.1 解法1
    • 2.2 解法2
    • 2.3 解法3
    • 2.4 解法4
  • 三、结果提交

一、题目描述

在这里插入图片描述

二、解题思路

2.1 解法1

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
    	if not strs:  # 如果字符串数组为空,则返回空字符串
        	return ""

    	min_len = min(len(s) for s in strs)  # 找到字符串数组中最短字符串的长度
    	common_prefix = ""  # 初始化公共前缀

    	for i in range(min_len):  # 遍历最短字符串的每个字符
        	char = strs[0][i]  # 获取第一个字符串中的当前字符

        	# 检查其他字符串中对应位置的字符是否与第一个字符串中的字符相同
        	if all(s[i] == char for s in strs):
            	common_prefix += char  # 如果相同,则将字符添加到公共前缀中
        	else:
            	break  # 如果有不相同的字符,则退出循环

    	return common_prefix

这段代码是一个查找字符串数组中最长公共前缀的函数。让我们逐行解读代码:

  1. if not strs::如果字符串数组为空,则返回空字符串。这个条件检查数组是否为空,如果为空,则没有公共前缀可找,直接返回空字符串。
  2. min_len = min(len(s) for s in strs):找到字符串数组中最短字符串的长度。通过使用生成器表达式和min函数,获取字符串数组中所有字符串的长度,并返回最小值,即最短字符串的长度。
  3. common_prefix = “”:初始化公共前缀为空字符串。
  4. for i in range(min_len)::遍历最短字符串的每个字符的索引。
  5. char = strs[0][i]:获取字符串数组中的第一个字符串中的当前字符。这里假设第一个字符串不为空,因为前面已经检查过数组是否为空。
  6. if all(s[i] == char for s in strs)::检查其他字符串中对应位置的字符是否与第一个字符串中的字符相同。通过使用生成器表达式和all函数,遍历字符串数组中的每个字符串,检查当前字符是否与第一个字符串中的字符相同。只有当所有字符串的当前字符都相同时,条件才成立。
  7. common_prefix += char:如果相同,则将当前字符添加到公共前缀中。
  8. else::如果有不相同的字符,则退出循环。
  9. break:退出循环,不再继续遍历后面的字符。
  10. return common_prefix:返回最长公共前缀。

该函数通过逐个比较字符的方式,找到字符串数组中的最长公共前缀,并返回结果。

2.2 解法2

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if not strs:
            return ""

        # 将字符串数组按字典序排序
        strs.sort()
        
        # 比较排序后的第一个字符串和最后一个字符串的公共前缀
        common_prefix = ""
        for i in range(len(strs[0])):
            if strs[0][i] == strs[-1][i]:
                common_prefix += strs[0][i]
            else:
                break

        return common_prefix

这个优化算法的思路是,将字符串数组按字典序排序,然后比较排序后的第一个字符串和最后一个字符串的公共前缀。因为排序后的字符串数组,第一个字符串和最后一个字符串的公共前缀一定是整个数组的公共前缀。所以只需要比较这两个字符串的公共前缀即可。

你可以将这个类方法放在类中使用,或者直接调用该函数来查找字符串数组中的最长公共前缀。

2.3 解法3

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if not strs:
            return ""

        # 找到最短的字符串长度
        min_len = min(len(s) for s in strs)

        # 比较每个字符位置上的字符是否相同
        common_prefix = ""
        for i in range(min_len):
            if all(s[i] == strs[0][i] for s in strs):
                common_prefix += strs[0][i]
            else:
                break

        return common_prefix

这个优化算法的思路是,在找到最短的字符串长度后,只需比较每个字符位置上的字符是否相同。通过使用 all 函数,遍历每个字符串的对应字符,只有当所有字符串的当前字符都相同时,才将该字符添加到公共前缀中。

这种优化可以减少不必要的比较操作,并在不需要排序的情况下找到最长公共前缀,进一步减少运行时的时间和内存消耗。

2.4 解法4

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        ans = ''
        for i in list(zip(*strs)):
            if len(set(i)) == 1:
                ans += i[0]
            else:
                break
        return ans
  1. ans = ‘’:初始化结果字符串为空。
  2. for i in list(zip(*strs))::使用zip(*strs)将字符串数组进行解压缩,将每个字符串的相同索引位置的字符组成元组。然后使用for循环遍历这些元组,即遍历字符串数组中的每个字符的相同索引位置。
  3. if len(set(i)) == 1::检查当前位置的字符是否都相同。通过将元组转换为集合(set)并检查集合中元素的数量是否为1,来判断是否所有字符相同。
  4. ans += i[0]:如果当前位置的字符都相同,则将字符添加到结果字符串中。由于在这个位置上所有字符都相同,所以选择任意一个字符添加到结果字符串中都可以。
  5. else::如果有不相同的字符,则退出循环。
  6. break:退出循环,不再继续遍历后面的位置。
  7. return ans:返回最长公共前缀。

该函数通过逐个比较字符的方式,找到字符串数组中的最长公共前缀,并返回结果。与之前的实现相比,这个代码使用了zip函数和集合来简化逻辑,并更加紧凑和高效地查找公共前缀。

三、结果提交

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MIL-STD-1553B总线系统搭建指导

MIL-STD-1553B总线系统搭建指导 1.1553B总线协议 1.11553B总线介绍 MIL-STD-1553B(GJB 289A)是一种应用于机载电子设备间通信的共享式总线通信协议,以总线式拓扑结构连接最多31个终端设备互联,传输速率为1Mbps,在航…

任务跟踪器重要性探析:提升项目效率,实现管理优化

使用任务跟踪器完成项目的最显著好处之一是它们大大减少了开始新项目的初始阻力,尤其是当它们是大型、长期和复杂的项目时。任务跟踪器可用于将这些艰巨的项目分解为更小的、相互依赖的任务,这些任务有助于激发动力和行动以实现最终目标。使用项目任务跟…

Python: 让单元测试输出像GoogleTest一样

文章目录 1. 目的2. 原版 unittest 的输出3. 仿 GoogleTest 的输出效果4. 实现原理浅析传入 testRunner 参数testRunner 参数应该满足的条件颜色高亮: ASCII 转义字符的使用测试用例输出文本内容的格式调整:仿googletest 5. 完整实现代码6. 完整调用代码…

$‘\r‘: command not found syntax error near unexpected token `$‘do\r‘‘ 解决方案

问题描述 今天在执行代码时出现了这样的错误: bash xxx.sh xxx.sh: line 2: $\r: command not found xxx.sh: line 7: $\r: command not found xxx.sh: line 8: syntax error near unexpected token $do\r 经查阅,发现是.sh文件在windows下编辑&#xf…

Nevron Open Vision for .NET Crack

Nevron Open Vision for .NET Crack 增加了对Microsoft.NET 7.0的支持-NOV现在完全支持.NET Core 7.0,此外还支持Microsoft.NET Framework 4.7.2、.NET Core 5.0和.NET Core 6.0的内部版本。 用于.NET改进的NOV图表 添加了WPF和WinForms版本中提供的新3D渲染引擎。新…

展会回顾 | 2023元宇宙生态博览会圆满落幕,3DCAT荣获“元宇宙交互技术奖”

2023年5月10日-5月12日,一场涵盖了元宇宙终端头显、数字文娱、数字艺术、数字运动、数字多媒体展陈设计、数字展厅展馆、科技文旅、夜游演艺、沉浸式KTV/酒吧等多个领域的元宇宙商业盛会——2023第2届世界元宇宙生态博览会在广州广交会展馆A区3.2馆、4.2馆掀开帷幕。…

Python求balance_list【三】

本文为博主原创,未经授权,严禁转载及使用。 本文链接:https://blog.csdn.net/zyooooxie/article/details/130159648 很早之前,我写了2篇 如何求balance_list 的博客: https://blog.csdn.net/zyooooxie/article/detail…

DeepFM - 工业界经典baseline(哈工大 华为)

文章目录 1、模型结构如下:2、关键理解点:3、代码实现细节:DeepFM: A Factorization-Machine based Neural Network for CTR Prediction。dfm由哈工大和华为合作发表在IJCAI-2017;模型结构很简单,wide&deep结构。1、模型结构如下: 相比wide&deep [下文简称wd] 有…

就业内推 | 应届生校招、实习,上市公司有岗,最高18k*15薪

01 UCloud 🔷招聘岗位:网络工程师 🔷职责描述: 1、负责UCloud全球骨干网或数据中心网络工作,包括设备技术选型、架构运营方案设计、日常运维支持 2、持续提升网络稳定性与性能。 🔷任职要求: …

Flowable-modeler可视化教程

Flowable-Modeler功能 提供可视化编辑器,编辑BPMN流程,编辑CASE模型,编辑Form表单,编辑App应用,编辑决策表提供可视化参数配置:每个流程可以配置详细的参数设置,按照流程对应的规范来设计。提供…

学Python的都在说爬虫容易进去,你还敢做爬虫吗?十分钟带你规避可拷风险

阅读文本大概需要 10 分钟,今天,不要面向监狱编程了。 序言 前段时间有一篇名为《只因写了一段爬虫,公司200多人被抓!》的文章非常火,相信大家应该都看到了。 这篇文章火起来之后,本来经过了一个多月的时…

【Spring框架】--01.Spring概述、入门

文章目录 Spring1.概述1.1Spring是什么?1.2 Spring 的狭义和广义1.3 Spring Framework特点1.4 Spring模块组成1.5 Spring6特点1.5.1版本要求 2.入门2.1 构建模块2.2 程序开发2.2.1 引入依赖2.3.2 创建java类2.3.3 创建配置文件2.3.4 创建测试类测试2.3.5 运行测试程…

centos上搭建redis伪集群

1.安装ruby 搭建redis集群需要ruby脚本,需要安装ruby的环境 (1)yum install ruby (2) yum install rubygems 2. 复制安装完成的redis /usr/local目录下创建redis-cluster目录,复制已经安装完成的redis到 /usr/local/redis-cluster/redis01目录&#x…

京东软件测试岗位经典面试题(附答案)

1、黑盒测试的测试用例常见设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 1)等价类划分:等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假…

【从零开始写视觉SLAM】v0.1基于特征点的简单VO

v0.1版本的oSLAM实现了基于orb特征点的简单视觉里程计,通过连续两帧的rgbd数据实现相机相对位姿的估计。 #mermaid-svg-ibQfHFVHezQD5RWW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ibQfHFVHezQD5RW…

MySQL数据库---笔记1

MySQL数据库---笔记1 一、数据库概述1.1、什么是数据库1.2、数据库的安装与启动1.3、MySQL数据模型 二、SQL2.1、通用语法及分类2.2、DDL2.2.1、数据库操作 一、数据库概述 1.1、什么是数据库 名称全称简称数据库存储数据的仓库,数据是有组织的进行存储DataBase (…

LeetCode每日一题之二分搜索

文章目录 1.关于二分搜索常见的误区2.左闭右闭区间的写法3.左闭右开区间的写法4.找到第一个大于target的数5.找到第一个小于target的数6.找到第一个大于等于taregt的数7.找到第一个小于等于target的数 1.关于二分搜索常见的误区 区间的定义: 2.左闭右闭区间的写法…

(MIT6.045)自动机、可计算性和复杂性-正则表达式

语言(language)的计算性质:交、并、补、反转、拼接、星号(*) 星号是一元运算符,表示一个语言和自己的有穷次笛卡尔积。 回顾:正则语言(Regular Language)指可以用DFA描述的语言。 正则表达式…

Linux内核panic简析

源码基于:Linux 5.4 0. 前言 内核异常的级别大致分为三个:BUG、oops、panic。 BUG 是指那些不符合内核的正常设计,但内核能够检测出来并且对系统运行不会产生影响的问题,比如在原子上下文中休眠,在内核中用 BUG 标识。…

Linux——线程3|线程互斥和同步

加锁保护 我们上一篇提到过,多个线程执行下面代码可能会出错,具体原因可查看上一篇Linux博客。