力扣最长公共前缀

力扣14.题目描述:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。

示例1 输入: ["flower","flow","flight"]       

          输出: "fl"
示例2 输入: ["dog","racecar","car"]       

          输出: ""     

解释: 输入不存在公共前缀。
说明:所有输入只包含小写字母 a-z 。

那么,最近学习的python,所以想练习一下python,因此下面的都是python的解法

解法1思想是:首先求出所给字符串中的最小长度num,然后分别把每个字符串具有相同下标(0,1,2....num-1)的字母存到数组中,然后用set集合去除重复值,如果去除重复值之后的数组长度不为0那说明存在公共的字母,然后把这个字母放在数组dist中,然后开始下一轮循环;否则就说明不存在公共的字母,那么就结束了。

def longestCommonPrefix(strs):
    if len(strs) == 0:
        return ''
    num = min([len(e) for e in strs])
    print(num)
    dst = []
    for i in range(num):
        cur = [e[i] for e in strs]
        print(cur)
        if len(set(cur)) == 1:
            dst.append(cur[0])
        else:
            break
    return ''.join(dst)

if __name__ == "__main__":
    res = longestCommonPrefix(["dog","racecar","car"])
    print(res)

解法2思想是:在python中,字符串是可以比较的,因此按照ASCII值我们只需要比较最大和最小字符串的公共前缀,得到的就是整个数组的公共前缀,这里用到了enumerate方法,那么enumerate()方法的说明如下:

对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值;enumerate多用于在for循环中得到计数。下面是个例子:

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

if __name__ == "__main__":
    res = longestCommonPrefix(["dog","racecar","car"])
    res = longestCommonPrefix(["flower","flow","flight"])
    print(res)

解法3思想:利用python的zip函数,把str看成list然后把输入看成二维数组,左对齐纵向压缩,然后把每项利用集合去重,之后遍历list中找到元素长度大于1之前的就是公共前缀。那么其中有用到map的操作和zip,详情请参考此篇博客

那么这条语句ss = list(map(set, zip(*strs)))的运行结果如下图:

def longestCommonPrefix(strs):
    if not strs: return ""
    ss = list(map(set, zip(*strs)))
    #print(ss)
    res = ""
    for i, x in enumerate(ss):
        x = list(x)
        if len(x) > 1:
            break
        res = res + x[0]
    return res

if __name__ == "__main__":
    res = longestCommonPrefix(["dog","racecar","car"])
    res1 = longestCommonPrefix(["flower","flow","flight"])
    print(res)
    print(res1)

以上3种方法均可以解决这个问题,还需要多多练习!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值