题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
思路:
本题虽然只是“容易”等级的题目,但是可以有至少五种解法,而且这是一个在搜索领域中很常见的问题,所以还是值得一看。
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs) == 0:
return ''
s = strs[0]
for t in strs[1:]:
long_common_prefix = ''
for p, q in zip(s, t):
if p == q:
long_common_prefix += p
else:
break
s = long_common_prefix
# 出现空串时提前结束
if s == '':
return ''
return s
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs) == 0:
return ''
long_common_prefix = strs[0]
for s in strs[1:]:
while s.find(long_common_prefix) != 0:
long_common_prefix = long_common_prefix[:-1]
if long_common_prefix == '':
return ''
return long_common_prefix
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs) == 0:
return ''
for i in range(len(strs[0])):
for s in strs[1:]:
if i == len(s) or s[i] != strs[0][i]:
return s[:i]
return strs[0]
分治法:对于方法2,可以采用分治思想,将数组从中间一分为二,分别求两边子数组的最长公共前缀。而每一个子数组也可以一分为二…
分治法实际上也没有减少比较的次数,因此时间复杂度不变。同时因为采用了递归,所以空间复杂度为 O ( m ⋅ l o g ( n ) ) O(m\cdot log(n)) O(m⋅log(n)), n为字符串个数,m为字符串长度
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs) == 0:
return ''
return self.split_list(strs, 0, len(strs)-1)
def split_list(self, strs, start, end):
if start == end:
return strs[start]
else:
middle = (end + start) // 2
left_str = self.split_list(strs, start, middle)
right_str = self.split_list(strs, middle + 1, end)
return self.get_common_prefix(left_str, right_str)
def get_common_prefix(self, s, t):
min_len = min(len(s), len(t))
for i in range(min_len):
if s[i] != t[i]:
return s[:i]
return s[:min_len]
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs) == 0:
return ''
def is_common_prefix(prefix, str_list):
for s in str_list:
if s[:len(prefix)] != prefix:
return False
return True
min_str = min(strs, key=len)
start, end = 0, len(min_str)
while start < end:
mid = (end + start + 1) // 2
if is_common_prefix(min_str[:mid], strs):
start = mid
else:
end = mid - 1
return min_str[:(end + start) // 2]
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
②. 方法三如果使用python,可以有更加简单的写法
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
s = ""
"""
>>> a = [[1,2,3], [4,5,6]]
>>> zip(*a)
>>> [[1,4], [2,5], [3,6]]
"""
for i in zip(*strs):
if len(set(i)) == 1:
s += i[0]
else:
break
return s