Leetcode 14. 最长公共前缀 Python

本文详细解析了LeetCode第14题“最长公共前缀”的两种解法,包括一种较慢的个人解法和一种经提示后更为高效的方法。通过对比不同解法的优劣,帮助读者理解如何优化算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 1:

输入: [“flower”,“flow”,“flight”]
输出: “fl”

自己解法1(太慢了)

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        
        out = ""
        if strs==[]:return out
            
        for j in range(len(strs[0])):
            p=0
            for i in range(1,len(strs)):
                if j>len(strs[i])-1: break
                if strs[0][j] == strs[i][j]:
                    p = p+1
                else:return out
            if p==len(strs)-1:
                out += strs[0][j]
        return out

在这里插入图片描述
汗颜。

经提示解法(较慢)

class Solution:
            
    def longestCommonPrefix(self, strs: List[str]) -> str:
        out = ""
        if strs==[]:return out #空字符输出
        if len(strs)==1:return strs[0]
        #如果列表长度是1输出第一个字符,节省空间时间
        
        newstrlength = len(min(strs, key=len))  #巧!先把公共长度缩小成列表中最小字符串的长度  
        for j in range(0,len(strs)-1):
            if strs[j]=="":
                return out    #只要有空行就直接输出空字符串(节省时间空间)
            newstrlength=min(len(strs[j+1]),newstrlength)  #长度和下一字符串长度的最小值
            for i in range(newstrlength):
                if strs[j][i] != strs[j+1][i]:
                    newstrlength = i
                    break
            #只要有不一样的,置newstrlength值并进入下一个字符比较循环
        return strs[0][:newstrlength] #返回第一个字符串前公共数个字符就好

在这里插入图片描述

思路:
在这里插入图片描述
虽然效果一样,但是更简洁的办法看
https://tundrazone.com/?p=189

大神

https://blog.youkuaiyun.com/qq_34364995/article/details/80274107
非常简洁,但是看不太懂,希望有看懂的同学跟我交流。

        res = ""
        if len(strs) == 0:
            return ""
        for each in zip(*strs):#zip()函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
            if len(set(each)) == 1:#利用集合创建一个无序不重复元素集
                res += each[0]
            else:
                return res
        return res

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值