4. Longest Common Prefix

31 篇文章 0 订阅
27 篇文章 0 订阅

找出一组字符串的最长公共前缀

解法一:水平扫描

从前往后枚举字符串的每一列,先比较每个字符串相同列的字符(即不同字符串相同下标的字符)然后再进行对下一列的比较。

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        l = len(strs)
        if strs == None or l == 0:
            return ""
        for i in range(len(strs[0])):
            c = strs[0][i]
            for j in range(1, l):
                if len(strs[j]) == i or strs[j][i] != c:
                    return strs[0][0:i]
        return strs[0]

解法二:分治法(解决类似问题的模板

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if strs is None or len(strs) == 0:
            return ""
        return self.findLCP(strs, 0, len(strs) - 1)
    
    def findLCP(self, strs, l, r):
        if l == r:
            return strs[l]
        m = (l + r ) / 2
        lPart = self.findLCP(strs, l, m)
        rPart = self.findLCP(strs, m + 1, r)
        return self.concatLR(lPart, rPart)
    
    def concatLR(self, lPart, rPart):
        mmin = min(len(lPart), len(rPart))
        for i in range(mmin):
            if lPart[i] != rPart[i]:
                return lPart[0:i]
        return lPart[0:mmin]
        
        

解法三:二分查找

S[1...mid] 不是所有串的公共前缀。 这表明对于所有的 j > i S[1..j] 也不是公共前缀,于是我们就可以丢弃后半个查找区间。

S[1...mid] 是所有串的公共前缀。 这表示对于所有的 i < j S[1..i] 都是可行的公共前缀,因为我们要找最长的公共前缀,所以我们
可以把前半个查找区间丢弃。
class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        l = len(strs)
        if strs == None or l == 0:
            return ""
        minLen = float('inf')
        for i in range(l):
            minLen = min(minLen, len(strs[i]))
        low = 1
        high = minLen 
        while low <= high:
            middle = (low + high) / 2
            if self.isCommon(strs, middle):
                low = middle + 1
            else:
                high = middle - 1
        res = (low + high)/2
        return strs[0][0:res]
    
    def isCommon(self, strs, ll):
        for i in range(ll):
            for j in range(1, len(strs)):
                if strs[j][i] != strs[0][i]:
                    return False
        return True

这里low和high的设置==不太懂 

        low = 1
        high = minLen 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值