编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
# 解法一:水平扫描法 72ms
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
'''
1.list长度小于1,返回''
2.list长度为1的情况面试时需要问清楚
2.3个及以上元素时,只要有1个元素不包含公共前缀,返回''
3.不同字符串长度不一致,考虑超出边界值情况
'''
if not strs:
return ''
if len(strs) == 1:
return strs[0]
ref_str = strs[0]
res_str = ''
for i, i_str in enumerate(ref_str):
for j in range(1, len(strs)):
if i >= len(strs[j]):
return res_str
elif strs[j][i] != i_str:
return res_str
else:
pass
res_str += i_str
return res_str
# 解法二:利用zip函数 64ms
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
'''
1.list长度小于1,返回''
2.list长度为1的情况面试时需要问清楚
2.3个及以上元素时,只要有1个元素不包含公共前缀,返回''
3.不同字符串长度不一致,考虑超出边界值情况
'''
s = zip(*strs)
r = [len(set(c)) == 1 for c in s] + [False]
if strs:
s = r.index(False)
return strs[0][:s]
else:
return ''
# 解法三:利用zip+排序 44ms
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
'''
1.list长度小于1,返回''
2.list长度为1的情况面试时需要问清楚
2.3个及以上元素时,只要有1个元素不包含公共前缀,返回''
3.不同字符串长度不一致,考虑超出边界值情况
'''
if len(strs) == 0:
return ""
if len(strs) == 1:
return strs[0]
strs.sort()
p = ""
for x, y in zip(strs[0], strs[-1]):
if x == y:
p += x
else:
break
return p