python:编写一个函数查找字符串中的最长公共前缀

news/2024/9/24 9:23:04/

最近在csdn网站上刷到一个题目,题目要求编写一个函数查找字符串中的最长公共前缀,题目如下:

给出的答案如下:

from typing import List
def longestCommonPrefix(strs:List[str]) -> str:if len(strs) == 0:return ''i = 0     #代表公共前缀的位数lcp = []  #存放公共前缀while True:done = Falseif  i >= len(strs[0]):breakj = 0   #代表strs列表中的元素个数,依次对元素做比较while j < len(strs):if i < len(strs[j]):if strs[j][i] != strs[0][i]:done  = Truebreakelse:done = Truebreakj+=1if not done:lcp.append(strs[0][i])i+=1else:breakreturn ''.join(lcp)

乍一看确实有些复杂了,但是思路也还比较清晰:

使用列表中的第1个元素作为比较对象,依次对比第1个元素中的每1位字符是否与其他元素的该位置的字符一致,如果一致就加入到新的列表,遇到不一致的就break退出,最后通过字符串的join方法返回公共前缀。

strs = ['flower','flow','flight','flue']
print(f'公共前缀:{longestCommonPrefix1(strs)}')
#结果
fl

我们可以改良下代码,看上去更好理解,处理思路如下:

先获取给定列表中的最短的元素,在该元素的基础上循环检查其他元素的每一个位是否相同,相同就加入新的列表,遇到不一致的就break退出,最后通过字符串的join方法返回公共前缀。

主要改造说明:

1)使用sorted函数将列表按照元素length从小到达排列,获取到最短的元素

2)使用列表推导式挨个获取相同位置的元素,如果是一样的,经过集合转换后,只会保留1个元素(集合是不重复的元素,可以达到去重功能)

改良的函数如下:

def longestCommonPrefix1(strs:List[str]) -> str:if len(strs) == 0:return ''#使用sorted函数将列表按照元素length从小到达排列,获取到最短的元素new_strs[0]new_strs = sorted(strs,key=lambda x:len(x),reverse=False)print(new_strs)lcp = []  #存放公共前缀#使用range函数循环处理最短元素lengthfor i  in range(len(new_strs[0])):#使用列表推导式挨个获取相同位置的元素,如果是一样的,#经过集合转换后,只会保留1个元素(集合是不重复的元素,可以达到去重功能)if len(set([j[i] for j in new_strs ])) == 1:lcp.append(new_strs[0][i])else:breakreturn ''.join(lcp)
strs = ['flower','flow','flight','flue']
print(f'公共前缀:{longestCommonPrefix1(strs)}')
strs = ['flower','flow','flight','dlue']
print(f'公共前缀:{longestCommonPrefix1(strs)}')
#结果:
['flow', 'flue', 'flower', 'flight']
公共前缀:fl
['flow', 'dlue', 'flower', 'flight']
公共前缀:

不知道大家还有什么方法,请评论区指教。

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习,谢谢大家。


http://www.ppmy.cn/news/1529749.html

相关文章

【linux】基础IO(上)

1. 共识原理 文件 内容 属性文件分为 打开的文件 没打开的文件打开的文件 &#xff1a; 是进程打开的 ----- 本质是要研究文件和进程的关系没打开的文件 &#xff1a; 没打开的文件储存在磁盘上&#xff0c;由于没打开的文件很多&#xff0c;所以需要分门别类的防止好&…

全国职业院校技能大赛(大数据赛项)-平台搭建Spark、Scala笔记

Spark作为一个开源的分布式计算框架拥有高效的数据处理能力、丰富的生态系统、多语言支持以及广泛的行业应用。Scala是一种静态类型的编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性&#xff0c;被誉为通用的“大数据语言”。而二者的结合更能迸发出新奇的化学反…

浅谈Python之协程和进程

一、基本介绍 在Python中&#xff0c;协程和进程是两种不同的并发执行方式&#xff0c;它们各自有适用的场景和优势。协程通常用于异步I/O操作&#xff0c;而进程则用于CPU密集型任务或需要隔离的并发执行环境。 协程&#xff08;Coroutine&#xff09; 协程是一种程序组件&am…

Dockerfile自定义制作镜像,其中10个指令的作用分析

docker容器中 做镜像是重要的技能。 docker commit只能制作比较简单的镜像&#xff0c; 要制作比较完善的镜像&#xff0c; 自定义程度比较高的&#xff0c; 就需要用到dockerfile dockerfile可以回溯历史 动态生成镜像。 FROM是基础镜像 CMD是在容器创建的时候默认的启动命令 …

【GitLab】安装和使用

安装 拉取gitlab镜像&#xff1a; docker pull gitlab/gitlab-ce:12.7.6-ce.0运行镜像容器&#xff1a; docker run -itd --name gitlab -p 443:443 -p 80:80 -p 222:22 --restart always -m 4GB -v /data/gitlab/config:/etc/gitlab -v /data/gitlab/logs:/var/1og/gitlab …

【Android】模糊搜索与数据处理

【Android】模糊搜索与数据处理 本篇博客主要以根据输入内容动态获取城市为例进行讲解。 获取城市 这一部分主要是根据输入的信息去动态获取城市信息 首先定义了一个名为 NetUtil 的类&#xff0c;主要用于通过 HTTP 请求获取城市信息。 public class NetUtil {private stat…

【Text2SQL】DAIL-SQL阿里推出,在Spider取得了SOTA

论文解读&#xff1a;Text-to-SQL Empowered by Large Language Models: A Benchmark Evaluation 论文详细介绍了DAIL-SQL方法&#xff0c;这是一个针对Text-to-SQL任务的提示工程方法。这个方法旨在通过精心设计的提示&#xff08;prompt engineering&#xff09;来优化大型语…

Linux 基础入门操作 第九章 进程间通信之管道

第九章 进程间通信 进程通信有如下一些目的&#xff1a; A、数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程&#xff0c;发送的数据量在一个字节到几 M 字节之间 B、共享数据&#xff1a;多个进程想要操作共享数据&#xff0c;一个进程对共享数据的修改&#xf…