Leetcode 14 Longest Common Prefix

来源:互联网 发布:淘宝二级页面全屏 编辑:程序博客网 时间:2024/06/09 14:41

14.Longest Common Prefix

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

题目要求返回一个最长公共前缀,先看代码:

class Solution(object):    def longestCommonPrefix(self, strs):        """        :type strs: List[str]        :rtype: str        """        length = strs.__len__()        if length < 1:            return ""        if length == 1:            return strs[0]        strs.sort()        prefix = strs[0]        target = strs[length - 1]        result = ""        for i in range(prefix.__len__()):            if prefix[i] == target[i]:                result += prefix[i]            else:                break        return result
  • 因为只是要求返回最长的公共前缀,因此可以先对列表进行排序
  • 排序后,可以将列表中的第一个元素作为前缀的基准,将其与列表中最后一个字符串进行比较即可

以下是在submission中看到的答案:

class Solution(object):    def longestCommonPrefix(self, strs):        """        :type strs: List[str]        :rtype: str        """        prefix = ''        for x in zip(*strs):            bag = set(x);            if len(bag) == 1:                prefix += bag.pop();            else:                break;        return prefix;
  • 这个解法巧妙的运用了zip函数,对strs进行拆解,然后丢入zip中
  • zip结果的个数与strs中,最短的字符串的长度是相等的
  • 使用set函数将zip对象转化为set
  • 若zip从每个字符串中取得的字母是一样的,则bag的大小一定为1,这也就是将zip对象转为set的意义所在。bag的长度如果为1,那么说明这个字母一定是列表中所有字符中都有的,也就是说这个字母就是公共前缀的一部分
  • 循环zip函数返回的每个结果并转为set,直到set的长度不为1为止

当然,使用resuce函数也是一个做法:

class Solution(object):    def longestCommonPrefix(self, strs):        """        :type strs: List[str]        :rtype: str        """        def lcp(str1, str2):            i = 0            while i < min(len(str1), len(str2)) and str1[i] == str2[i]:                i += 1            return str1[:i]        return reduce(lcp, strs) if strs else ''
原创粉丝点击