来自网友syrupmachine:
class Solution:
# @return a string
def longestCommonPrefix(self, strs):
if not strs:
return ""
for i, letter_group in enumerate(zip(*strs)):
if len(set(letter_group)) > 1:
return strs[0][:i]
else:
return min(strs)
这样一看有一些看不懂的东西,看来学python还有很长的路要走的。。
for i, letter_group in enumerate(zip(*strs)):
if len(set(letter_group)) > 1:
return strs[0][:i]
从这一句看起 首先enumerate这个在之前学c的时候见过,是枚举类型
seq = ['one', 'two', 'three']
for i, element in enumerate(seq):
print i, element
从这一段代码里面 就应该能够看得懂是怎么用的了,这段的输出是
0 one
1 two
2 three
zip这个函数没有见过,在网上找一段代码来理解
a = [1,2,3]
b = [4,5,6]
c = [4,5,6,7,8]
zipped = zip(a,b)
如上,如果输出zipped得到的结果是
[(1, 4), (2, 5), (3, 6)]
看来zip的作用是将对象打包成元组。
那么在这道题的代码里面用到的是
zip(*zipped)
这个是什么作用呢
看输出
[(1, 2, 3), (4, 5, 6)]
看来是一个解打包的作用
我的python版本是3.7.1测试了一下如下代码会返回错误值
list = ["dog","rabbit","fish"]
a = zip(*list)
print(a)
输出为<zip object at 0x0000019DC4EC2A08>
参考了这篇blog,原来是python2和python3的区别
改成如下就正确啦
list = ["dog","rabbit","fish"]
a = zip(*list)
for i in a:
print (i)
这个时候输出变为
('d', 'r', 'f')
('o', 'a', 'i')
('g', 'b', 's')
zip到此为止,下面看一下set(我咋啥都不会)
set是一个无序的不重复的序列。详细的内容不想写了。
插一句。。。。我看代码没看懂的原因之一是没有在意prefix这个单词的意思,刚刚去逛了一下中文leetcode,发现他是前缀的意思,也就是说,['wwfff','ffaaa','ccffc']这种情况,不需要考虑ff是不是最长的(因为不是最长公共子序列的问题!)
那么现在就很好理解了比如题里面所给的例子
["flower","flow","flight"]
在zip之后变成
('f', 'f', 'f')
('l', 'l', 'l')
('o', 'o', 'i')
('w', 'w', 'g')
那么代码的意思就是,看什么时候不存在了最长前缀,比如这个题,第一组都是f,刚刚说了set是可以用来去除重复的,那么前两组set之后的长度一直是1,到第三组开始大于了1,输出前两个元素,也就是fl
先写到这啦,睡觉了~~~