题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
方法一:暴力法
步骤:
1、判断输入字符串数组是否为空,是否只包含一个字符串,为空返回空字符串,为1返回仅有的一个字符串;
2、找到最短的字符串的长度
3、从左到右依次对比每一个字符串的字符,找到相同的最大公共前缀
提交结果:
执行用时 : 36 ms, 在Longest Common Prefix的Python提交中击败了19.10% 的用户
内存消耗 : 11.8 MB, 在Longest Common Prefix的Python提交中击败了0.62% 的用户
代码:
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if not strs:
return ""
elif len(strs) ==1:
return strs[0]
else:
min = len(strs[0])
rs = ''
#找到字符串数组里最短的字符串
for i in range(1,len(strs)):
if len(strs[i]) < min:
min = len(strs[i])
#将每一个字符串从左到右依次对比,找出最大的相同的部分
flag = True
for j in range(min):
for i in range(len(strs)-1):
if strs[i][j] != strs[i+1][j]:
flag = False
break
if not flag:
break
else:
rs += str(strs[i][j])
return rs
方法二:使用min()、max()函数
利用python的max()和min(),在Python里字符串是可以比较的,按照ascII值排,举例abb, aba,abac,最大为abb,最小为aba。所以只需要比较最大最小的公共前缀就是整个数组的公共前缀。
提交结果:
执行用时 : 32 ms, 在Longest Common Prefix的Python提交中击败了42.80% 的用户
内存消耗 : 11.9 MB, 在Longest Common Prefix的Python提交中击败了0.62% 的用户
代码:
class Solution(object):
def longestCommonPrefix(self, strs):
if not strs: return ""
s1 = min(strs)
s2 = max(strs)
for i,x in enumerate(s1):
if x != s2[i]:
return s2[:i]
return s1
方法三:使用zip()函数
利用python的zip函数,把str看成list然后把输入看成二维数组,左对齐纵向压缩,然后把每项利用集合去重,之后遍历list中找到元素长度大于1之前的就是公共前缀
代码:
class Solution(object):
def longestCommonPrefix(self, strs):
if not strs: return ""
ss = list(map(set, zip(*strs)))
rs = ""
for i, x in enumerate(ss):
x = list(x)
if len(x) > 1:
break
rs = rs + x[0]
return rs