14. 最长公共前缀

一、题目描述:

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""

示例1:

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

示例2:

输入:strs = ["dog","racecar","car"]
输出:""

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

二、答题

1、分析题目

        最长公共前缀,这个前缀满足所有字符串,且若有,一定在最短的字符串中。所以从该字符串长度开始递减寻找。

2、思路1 找最短长度,普通横向寻找

        先找最短字符串长度,再从该长度递减,直到该长度满足所有字符串即可,只要这个前缀不在随意一个字符串中,都是不满足条件的。

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        min_length = len(strs[0])
        length_true = True  # 设置判断该长度前缀是否符合所有字符串
        
        # 找最短字符串,需要最短长度
        for i in range(1, len(strs)):
            if len(strs[i]) < min_length:
                min_length = len(strs[i])
        # 或者一行代码:min_length = min([len(i) for i in strs])
        
        # 对比列表中的字符串,从最短字符串长度开始长度减小
        # 可用字符串切片来对比前缀
        for i in range(min_length, 0, -1):
            length_true = True
            for j in range(0, len(strs)):
                if min_str[0:i] != strs[j][0:i]:    # 比较
                    length_true = False
                    break
            if length_true: # 经过一轮,若长度符合则满足条件
                return (min_str[0:i])
        return ""    # 所有的都不行,返回空字符产
                        
3、思路2 使用set函数纵向对比寻找

        在对比寻找前缀是否满足条件时,可以将每个字符串的同一位置的字符取出形成一个集合,若集合长度大于1,则不符合条件。

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        min_length = min(len(i) for i in strs)
        min_str = ""
        for i in range(min_length):
            if len(set(s[i] for s in strs)) > 1:    # set函数去重
                break
            min_str += strs[0][i]
        return min_str
4、思路3 使用内置函数zip+set

使用zip函数取出每个单词相同位置的字母,这些字母会形成元组(zip()返回的是一个zip对象,需要通过list()转换成列表),将元组去重,如果去重后字母集合长度为1,说明该位置字符相同,就加入min_str,否则直接退出返回(默认从第一个字符开始)。

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        min_str = ''
        for i in list(zip(*strs)):
            if len(set(i)) == 1:
                min_str += i[0]
            else:
                break
        return min_str
# strs = ["flower","flow","flight"]
# print(list(zip(*strs)))
# 输出:[('f', 'f', 'f'), ('l', 'l', 'l'), ('o', 'o', 'i'), ('w', 'w', 'g')]

文章参考leetcode作者lgl1227。写博客方便记录,回忆,整合。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值