Datawhale leetcode训练营 第五天

题目描述

在这里插入图片描述

方法一:

我的想法和官方解答的方法一比较像。
思路就是
在这里插入图片描述

我觉得这个公式讲的很好,很精髓。
在这里插入图片描述

这个图也很到位~
加上我详细的代码解释简直完美


class Solution:
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        #水平扫描法
        # 先讨论公共前缀为‘’空字符的特殊情况
        # 如果字符串数组中不存在word
        if not strs:  
            return ''
        # 如果字符串数组仅存在一个word
        if len(strs) == 1:  
            return strs[0]
        # 如果字符串数组中有一个word为None空字符
        if '' in strs:
            return ''
        # 求出strs长度,也就是word的个数
        num = len(strs)
        #再求出这个字符串数组中字符数最少的word的字符数
        min_len = min([len(w) for w in strs])
        #然后用两层循环暴力求解
        #因为是最长公共前缀所以最多最多就只能和字符数最少那个word一样长
        for j in range(min_len): 
            #我们用第一个word作参照,虽然它可能是最短的,也可能不是最短的,但是没关系啊,我们只要比较到min_len就可以了
            #而且算法是LCP(S1,..,Sn)=LCP(LCP(LCP(S1,S2)S3),...,Sn)
            for i in range(1,num):
                #然后挨个比就完事了
                if strs[i][j] != strs[0][j]:
                    # 如果出现不等了,说明上一轮循环就是最大公共前缀到头的地方
                    return strs[0][:j]
        # 没有不相等的话,就直接是最短那个word了
        return strs[0][:min_len]  
        

方法二:

在这里插入图片描述

这里难点在于要知道
min(strs) 和 max(strs)的意义

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
       # 老样子,先讨论公共前缀为‘’空字符的特殊情况
        # 如果字符串数组中不存在word
        if not strs:  
            return ''
        # 如果字符串数组仅存在一个word
        if len(strs) == 1:  
            return strs[0]
        # 如果字符串数组中有一个word为None空字符
        if '' in strs:
            return ''
        # 在使用max和min的时候已经把字符串比较了一遍
        # 当前列表的字符串中,每个字符串*从第一个字母往后比较直至出现ASCII码 最小的*字符串
        s1 = min(strs)
        # 当前列表的字符串中,每个字符串*从第一个字母往后比较直至出现ASCII码 最大*的字符串
        s2 = max(strs)
        # 使用枚举变量s1字符串的每个字母和下标
        for i, c in enumerate(s1):
            # 比较是否相同的字符串,不相同则使用下标截取字符串
            if c != s2[i]:
                return s1[:i]
        return s1

#上面改进的是这个博主的代码:https://blog.csdn.net/chenhua1125/article/details/80542344

方法三:

借花敬佛了,我觉得最优博客的同学这部分写的很好,我复制一哈
zip大法好

https://blog.csdn.net/weixin_43955166/article/details/86711621

class Solution:
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        res = ""
        if len(strs) == 0:
            return ""
        for each in zip(*strs):#zip()函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
            if len(set(each)) == 1:#利用集合创建一个无序不重复元素集
                res += each[0]
            else:
                return res
        return res

说明:

*test 会将列表或者元组转化为可变参数。
zip()函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表


# zip函数展示
def zip(*iterables):
    # zip('ABCD', 'xy') --> Ax By
    sentinel = object()
    iterators = [iter(it) for it in iterables]
    while iterators:
        result = []
        for it in iterators:
            elem = next(it, sentinel)
            if elem is sentinel:
                return
            result.append(elem)
        yield tuple(result)


那么这个函数对于刚刚的例子,each返回的值应该是

扫描二维码关注公众号,回复: 6192126 查看本文章

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35547281/article/details/86727146