[leetcode刷题(easy)]之五: 最长公共前缀

题目描述:

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

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

示例 1:

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

示例 2:

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

说明:

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


方法一:暴力法

步骤:

1、判断输入字符串数组是否为空,是否只包含一个字符串,为空返回空字符串,为1返回仅有的一个字符串;

2、找到最短的字符串的长度

3、从左到右依次对比每一个字符串的字符,找到相同的最大公共前缀

提交结果:

执行用时 : 36 ms, 在Longest Common Prefix的Python提交中击败了19.10% 的用户

内存消耗 : 11.8 MB, 在Longest Common Prefix的Python提交中击败了0.62% 的用户

代码:

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if not strs:
            return ""
        elif len(strs) ==1:
            return strs[0]
        else:
            min = len(strs[0])
            rs = ''

            #找到字符串数组里最短的字符串 
            for i in range(1,len(strs)):
                if len(strs[i]) < min:
                    min = len(strs[i])
        
            #将每一个字符串从左到右依次对比,找出最大的相同的部分
            flag = True
            for j in range(min):
                for i in range(len(strs)-1):
                    if strs[i][j] != strs[i+1][j]:
                        flag = False
                        break
                if not flag:
                    break
                else:
                    rs += str(strs[i][j])

            return rs

方法二:使用min()、max()函数

利用python的max()和min(),在Python里字符串是可以比较的,按照ascII值排,举例abb, aba,abac,最大为abb,最小为aba。所以只需要比较最大最小的公共前缀就是整个数组的公共前缀。

提交结果:

执行用时 : 32 ms, 在Longest Common Prefix的Python提交中击败了42.80% 的用户

内存消耗 : 11.9 MB, 在Longest Common Prefix的Python提交中击败了0.62% 的用户

代码:

class Solution(object):
    def longestCommonPrefix(self, strs):
        if not strs: return ""
        s1 = min(strs)
        s2 = max(strs)
        for i,x in enumerate(s1):
            if x != s2[i]:
                return s2[:i]
        return s1
        

方法三:使用zip()函数

利用python的zip函数,把str看成list然后把输入看成二维数组,左对齐纵向压缩,然后把每项利用集合去重,之后遍历list中找到元素长度大于1之前的就是公共前缀

代码:

class Solution(object):
        def longestCommonPrefix(self, strs):
            if not strs: return ""
            ss = list(map(set, zip(*strs)))
            rs = ""
            for i, x in enumerate(ss):
                x = list(x)
                if len(x) > 1:
                    break
                rs = rs + x[0]
            return rs

猜你喜欢

转载自blog.csdn.net/weixin_41931548/article/details/89101360
今日推荐