I10-leetcode14最长公共前缀四种方法

文章提供了四种不同的方法来解决同一问题:查找字符串数组中的最长公共前缀。方法包括排序后比较、分治策略、纵向和横向的暴力扫描。每个方法都包含详细的代码实现。

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

题目描述:

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

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

代码实现:

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        #####################################################################
        #方法四:排序,比较第一个和最后一个
        def fun4(strs):
            def findTwoStr(str1, str2):#找两个的
                n = min(len(str1), len(str2))
                i = 0
                while i < n and str1[i] == str2[i]: i += 1
                return str1[:i]
            newS=sorted(strs)
            return findTwoStr(newS[0],newS[-1])
        return fun4(strs)

        #####################################################################
        #方法三:分治
        def fun3(strs):
            def lcp(begin,end):
                if begin==end:return strs[begin]
                mid=(begin+end)//2
                leftAns=lcp(begin,mid)
                rightAns=lcp(mid+1,end)
                minL=min(len(leftAns),len(rightAns))
                for i in range(minL):
                    if leftAns[i]!=rightAns[i]:return leftAns[:i]
                return leftAns[:minL]
            return '' if not strs else lcp(0,len(strs)-1)
        return fun3(strs)

        ##################################################################
        # 方法二:纵向暴力扫描
        def fun2(strs):
            if not strs: return ''
            ans = ''
            n = min(len(s) for s in strs)
            for i in range(n):
                c = strs[0][i]
                for j in range(1, len(strs)):
                    if strs[j][i] != c:
                        return ans
                ans += c
            return ans


        return fun2(strs)

        ##################################################################
        # 方法一:横向暴力扫描
        def findTwoStr(str1, str2):
            n = min(len(str1), len(str2))
            i = 0
            while i < n and str1[i] == str2[i]: i += 1
            return str1[:i]


        def fun1(strs):
            if not strs: return ''
            ans = strs[0]
            n = len(strs)
            for i in range(1, n):
                ans = findTwoStr(ans, strs[i])
                if not ans: break  # 提前结束
            return ans


        return fun1(strs)

        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值