Leetcode -最长公共前缀

题目

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

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

示例 1:

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

示例 2:

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

解法一:

常规解法:判断每一个字符串的对应列是否相同。
思路:固定住str[0],对str[0]进行遍历,然后循环判断后面字符串对应的列字符是否相同。

class Solution(object):
    def longestCommonPrefix(self, strs):
        if len(strs) == 0:
            return ''
        for i in range(len(strs[0])):
            c = strs[0][i]
            for j in range(1,len(strs)):
            # 遇到某个字符串已经遍历到最后,直接返回,因为最长公共前缀绝对是小于等于任何一个字符串的长度的
            # 遇到列对应的字符串也直接返回
            
                if i == len(strs[j]) or strs[j][i] != c:
                    return strs[0][0:i]
        return strs[0]

在这里插入图片描述

解法二:

zip(*) + 遍历方法
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

语法:

zip([iterable, ...])

# iterabl -- 一个或多个迭代器;

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
对上述示例一做解压缩如下:

>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 返回一个对象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped)  # list() 转换为列表
[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c))              # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
 
>>> a1, a2 = zip(*zip(a,b))          # 与 zip 相反,zip(*) 可理解为解压,返回二维矩阵式
>>> list(a1)
[1, 2, 3]
>>> list(a2)
[4, 5, 6]
>>>
res = [i for i in zip(*strs)]
print(res)

# 结果如下
[('f', 'f', 'f'), ('l', 'l', 'l'), ('o', 'o', 'i'), ('w', 'w', 'g')]

由结果可以看出,列表中的元组只要元组里面的所有元素都是一样的,那么当下的元组元素就是公共的。
我们只要从0开始遍历,遇到元组的元素都相同,就将元组的元组加进来res,遇到元组元素不全相同,即结束遍历。

完整解法

class Solution(object):
    def longestCommonPrefix(self, strs):
        str1 = ''
        for i in zip(*strs):
            if len(set(i)) == 1:
                str1 += i[0]
            else:
                break
        return str1

在这里插入图片描述
参考:
https://www.runoob.com/python3/python3-func-zip.html
https://www.runoob.com/python3/python3-func-zip.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值