leetcode #14

==============================================================================

【id】#14

【title】Longest Common Prefix

【description】

Write a function to find the longest common prefix string amongst an array of strings.

If there is no common prefix, return an empty string “”.

Example 1:

Input: [“flower”,“flow”,“flight”]
Output: “fl”
Example 2:

Input: [“dog”,“racecar”,“car”]
Output: “”
Explanation: There is no common prefix among the input strings.

Note:

All given inputs are in lowercase letters a-z.

【idea】

参考leetcode官网。
Horizontal scanning

垂直比较。先把第一个字符串当作前缀,比较紧邻的下一个字符串,获取二者的共同子串。依次向后比较获取最后的公共子串。

【code】

class Solution:
    def longestCommonPrefix(self, strs):
        if len(strs) == 0: return ''
        prefix = strs[0]
        for i in range(1, len(strs)):
            while not strs[i].startswith(prefix):
                prefix = prefix[:-1]
        return prefix

【idea】

水平比较

就是找到一个最短的字符串,依次比较list中的其他字符串,找到最长的公共子串。

【code】

class Solution:
    def longestCommonPrefix(self, strs):
        if len(strs) == 0: return ''
        shortest = min(strs, key = len)
        # print(shortest)
        for i ,v in enumerate(shortest):
            for x in strs:
                if x[i] != v:
                    return shortest[:i]
        return shortest

【idea】

二分查找。将list中的第一个字符串二分,high为list中最短的长度,依次去匹配list中 的其他字符串获取最大公共子串。

【code】

class Solution:
    def longestCommonPrefix(self, strs):
        if len(strs) == 0 or '' in strs: return ''
        minlen = min( map(lambda x : len(x) ,strs))
        low = 0
        high = minlen
        while high >= low:
            middle = (low+high)/2
            if self.isCommonprefix(strs,middle):
                low = middle+1
            else:
                high = middle-1
        return strs[0][:(low+high)/2] if (low+high)>=0 else ''
    def isCommonprefix(self, strs, position):
        prefix = strs[0][:position] if position!= 0 else strs[0][0]
        for i in range(1,len(strs)):
            if not strs[i].startswith(prefix):
                return False
        return True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值