4.5 练手

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vancooler/article/details/89047587

Leetcode 14 Longest Common Prefix

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.

解决方法: 

先处理空字符串、空数组、只有一个字符串数组,然后找出最短的字符一位一位判断。

需要注意的是输入会输入如 [] 和 [""] 

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        result = ""
        if len(strs) == 1:
            return strs[0]
        elif len(strs) == 0:
            return result
        else:
            shortedNum = 1000000000
            shortestWord =""
            #find the shortest word
            for i in range(len(strs)):
                if (len(strs[i])<shortedNum):
                    shortedNum = len(strs[i])
                    shortestWord = strs[i]
            print(shortedNum)
            for i in range(shortedNum):
                currentRe = result + shortestWord[i]
                for j in range(len(strs)):
                    if (strs[j])[0:i+1] != currentRe :
                        return result
                result = currentRe
            return result

时间复杂度还看得过眼。

Discuss 里面的思路:

1.zip() 和 set() 的巧妙用法

(之前不太清楚python list 中 的高级用法 zip()), 此处解释一下:

zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),第0个元组对应于所有参数的第0个元素,第1个元组对应于所有参数的第1个元素,依此类推,然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。
zip([1,2,3,4],[5,6,7,8])会返回[(1, 5), (2, 6), (3, 7), (4, 8)]
但是如果输入的参数在一个列表当中,比如[[1,2,3,4],[5,6,7,8]],就需要进行解包裹,就是在传递列表时,让列表的每一个元素对应一个位置参数。在调用func时使用*,是为了提醒Python:我想要把args拆成分散的多个个元素,分别传递给多个位置参数。
l = [[1,2,3,4],[5,6,7,8]]
zip(*l)所实现的功能与上面的代码相同,只不过输入的参数有列表接包裹得到。返回的结果中,第一个元素恰好对应于输入列表的第一列,因此对返回的结果进行索引可以得到输入列表对应的列。

他的解决方法如下:

先用zip()把每个字符串列表对应位构成tuples 之后 使用 set() 构建集合,利用集合的互异性判断每个tuple中是否只包含一个元素,记录第一个发现包含多个元素的tuple的位置,然后返回字符串这些位置的字符即可。 用zip()和 set()真的好有用啊,生气

def longestCommonPrefix(strs):
        len_lcp = 0
        for letters in zip(*strs):
            if len(set(letters)) > 1: break
            len_lcp += 1
        return '' if not strs else strs[0][:len_lcp]

2.速度超快的解法

直接从后往前找呗。

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if len(strs) == 0:
            return ''
        r = strs[0]
        length = len(r)
        for a in strs:
            tag = 0
            while(tag == 0):
                if r[0:length] == a[0:length]:
                    tag = 1
                else:
                    length = length - 1
        return r[0:length]
        

本来觉得这段代码应该会报错的,但是我发现python其实是不管list长度越界的,666.

猜你喜欢

转载自blog.csdn.net/vancooler/article/details/89047587
4.5