📅  最后修改于: 2023-12-03 15:12:26.707000             🧑  作者: Mango
给定一个包含多个字符串的数组,我们需要重新排列数组中的字符串,使得它们的公共前缀最长。
例如,给定数组 ["flower", "flow", "flight"]
,我们将其重新排列得到 ["flower", "flight", "flow"]
,则它们的最长公共前缀为 "fl"
。
为了解决这个问题,我们可以按照字典序对字符串数组进行排序,然后比较第一个字符串和最后一个字符串的公共前缀即可。
代码如下:
def longest_common_prefix(strs: List[str]) -> str:
if not strs: # 特判空字符串列表
return ""
strs.sort() # 按照字典序排序
prefix = strs[0] # 取第一个字符串作为初始最长公共前缀
for i in range(1, len(strs)):
while strs[i].find(prefix) != 0: # 不断截短前缀直到匹配
prefix = prefix[:-1]
if not prefix: # 如果最长公共前缀为空,则不需要继续比较
return ""
return prefix
时间复杂度:$O(nm\log m)$,其中 $n$ 是字符串的个数,$m$ 是字符串的最长长度。因为要对字符串数组进行排序,时间复杂度为 $n\log m$,而每个字符串的长度最多为 $m$,所以匹配时的时间复杂度为 $nm$。
空间复杂度:$O(1)$,因为只需要保存一个最长公共前缀。