leetcode: 最长公共前缀

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

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

首先,这一题的思路是从头到尾两辆比较,上一次比较的公共前缀用于下一次比较,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if strs == []:
return ""
else:
s = strs[0]
for i in range(1, len(strs)):
temp = ""
if strs[i] == "":
return ""
else:
for j in range(min(len(strs[i]), len(s))):
if(strs[i][j] == s[j]):
temp += s[j]
if j == min(len(strs[i]), len(s)) - 1:
s = temp
else:
s = temp;
break;
return s

可以看到,这个方法我们用了很多的特殊情况处理,比如只有空list,list中有空串等(一次次出错中补出来的= =)

评论中有一些启发的思路,比如说,字符串是可以比较大小的,那么不就可以直接只比较最大和最小的两项吗

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
temp = ""
if strs == []: //也能写成if not strs
return ""
else:
smax = max(strs)
smin = min(strs)
for i in range(min(len(smax), len(smin))):
if smax[i] == smin[i]:
temp += smax[i]
else:
break
return temp

另外就是利用zip函数,把str对齐压缩然后去重,取最短的对象的函数特性正好可以利用到,在list中找到长度大于1前的就是公共前缀,有点神奇:

1
2
3
4
5
6
7
8
9
10
11
class Solution(object):
def longestCommonPrefix(self, strs):
if not strs: return ""
ss = list(map(set, zip(*strs)))
res = ""
for i, x in enumerate(ss):
x = list(x)
if len(x) > 1:
break
res = res + x[0]
return res

这是今天的份了。

今天雨有点大,鞋也湿了,头有点痛晚上还有实验。。。

心塞的看看桌上的老婆,发现双十一买不起新老婆

呵,男人