leetcode 14. 最长公共前缀 多种解法及用一行代码解决的骚操作

题目

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

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

示例 1:

输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix

解答

解法一

先对字符串列表进行排序,排序的依据是字母表的顺序
然后比较第一个子串和最后一个子串,找到共同的部分

def longestCommonPrefix_1(strs):
    print('yes')
    if len(strs) == 0:    return ""
    if len(strs) == 1:    return strs[0]
    strs.sort()  # 对字符串列表进行排序,按照字符顺序
    print(strs)
    p = ""
    for x, y in zip(strs[0], strs[-1]):  # 只需要比较第一个和最后一个
        if x == y:
            p += x
        else:
            break
    return p
strs = ["flower", "flow", "flight"]
print(longestCommonPrefix_1(strs))

解法二

利用zip()函数,取多个字符串中的同一位置上的元素,进行比较。如果是相同的,那么这些元素在取set()后,长度为1。

# Python 特性,取每一个单词的同一位置的字母,看是否相同。
def longestCommonPrefix_2(strs):
    res = ''
    for tmp in zip(*strs):
        tmp_set = set(tmp)
        if len(tmp_set) == 1:
            res += tmp[0]
        else:
            break
    return res
    
strs = ["flower", "flow", "flight"]
print(longestCommonPrefix_2(strs))    

解法三

取一个单词 s,和后面单词比较,看 s 与每个单词相同的最长前缀是多少!遍历所有单词

def longestCommonPrefix_3(strs):
    if not strs:
        return ''
    res = strs[0]
    i = 1
    while i < len(strs):
        while strs[i].find(res) != 0:  # 查找res是否为strs[i]的子串,没找到就返回-1,如果是第0个位置匹配到的话,就返回0
            res = res[0:len(res) - 1]  # 从后往前缩短res
        i += 1
    return res

strs = ["flower", "flow", "flight"]
print(longestCommonPrefix_3(strs))

解法四:一行代码解决

def longestCommonPrefix_4(strs):
    import os
    return os.path.commonprefix(strs)

strs = ["flower", "flow", "flight"]
print(longestCommonPrefix_4(strs))

参考:
os.path.commonprefix

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值