题目描述
方法一:
我的想法和官方解答的方法一比较像。
思路就是
我觉得这个公式讲的很好,很精髓。
这个图也很到位~
加上我详细的代码解释简直完美
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 查看本文章