算法第六题(14.最长公共前缀)

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

#         prefix = strs[0]
#         for i in range(1,len(strs)):
#             prefix = self.compute_prefix(prefix,strs[i])
#             if not prefix:
#                 break
#         return prefix

#     def compute_prefix(self,prefix,str):
#         index = min(len(prefix),len(str))
#         if index <= 0:
#             return ""
#         for i in range(index):
#             if prefix[i]!=str[i]:
#                 return prefix[0:i]
#         return prefix[0:index]

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        def lcp(start, end):
            if start == end:
                return strs[start]

            mid = (start + end) // 2
            lcpLeft, lcpRight = lcp(start, mid), lcp(mid + 1, end)
            minLength = min(len(lcpLeft), len(lcpRight))
            for i in range(minLength):
                if lcpLeft[i] != lcpRight[i]:
                    return lcpLeft[:i]

            return lcpLeft[:minLength]

        return "" if not strs else lcp(0, len(strs) - 1)

思路1:很正常地横向比较,时间复杂度O(mn),空间复杂度O(1)
思路2:分治递归,时间复杂度O(mn),空间复杂度O(mlogn)
递归长度logn,每一层要保存m的长度。m为字符串平均长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值