leecode 最长公共前缀

这篇博客详细介绍了如何解决LeetCode上的‘最长公共前缀’问题,提供了三种不同的解题方法:垂直扫描法、水平扫描法和二分查找法。通过示例代码展示每种方法的实现思路,并对特殊情况进行了边界处理。

题目

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

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

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"
示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:

所有输入只包含小写字母 a-z 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

解题

class Solution(object):

    #1、垂直扫描法

    def longestCommonPrefix(self, strs):

        if len(strs)==0:  #提示越界后添加的校验

            return ""

        else:

            numStr=len(strs)

            for i in range(len(strs[0])):

                tmp_str=strs[0][i]

                flag=0

                for j in range(1,numStr):

                    if i>=len(strs[j]) or strs[j][i] <> tmp_str:

                        return strs[0][0:i] 

            return strs[0]  

 

    #2、水平扫描

    def longestCommonPrefix(self, strs):

        if len(strs)==0:

            return ""

        prefix=strs[0]

        numstr=len(strs)

        for j in range(1,numstr):

            while(strs[j].find(prefix)!=0):  #如果不是其他字符串的前缀

                prefix=prefix[0:len(prefix)-1]  #prefix从尾部去掉一个字符

                if not prefix:

                    return ""

        return prefix 

 

    #3、二分查找,将第一个字符串最长可能前缀二分处理

    #判断是否是前缀,取不到i

    def longestCommonPrefix(self, strs):

 

        def isCommonPrefix(strs, i):

            prefix=strs[0][0:i]

            for str in strs:

                if str[0:i]<>prefix:

                    return False 

            return True

 

        #特殊情况越界处理 

        if len(strs)==0 or strs is None:

            return ""

        #最短字符字符串长度

        min_len=len(strs[0])

        for str in strs[1:-1]:

            if len(str)<min_len:

                min_len=len(str)

 

        low =1

        high=min_len 

        while(low<=high):

            mid=(low+high)/2

            if isCommonPrefix(strs,mid):

                low=mid+1

            else:

                high=mid-1 

        return strs[0][0:(low+high)/2]

    ''' 

    #分治

    def longestCommonPrefix(self,strs):

        

        def find(strs, l, r):

            if l==r:

                return strs[l]

            else:

                mid=(l+r)/2 

                lcpLeft=find(strs,0,mid)

                lcpRight=find(strs,mid+1,r)

                return commonPrefix(lcpLeft, lcpRight)

        

        def commonPrefix(s1,s2):

            min_len=min(len(s1),len(s2))

            for i in range(min_len):

                if s1[i]<>s2[i]:

                    return s1[0:i]

            return s1[0:min_len]

 

        if strs is None or len(strs)==0:

            return ""

        else:

            return find(strs,0,len(strs)-1)



 

        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值