📅  最后修改于: 2023-12-03 15:11:40.265000             🧑  作者: Mango
给定一个字符串数组,需要找到具有最长公共前缀的字符串对,即找到数组中两个字符串的最长公共前缀,且这两个字符串的长度之和最大。
对数组进行排序,按照字符串长度从小到大排序,然后依次比较相邻两个字符串的前缀,取最长公共前缀即可。因为字符串长度越小,它们的最长公共前缀长度也越小,所以只需要比较相邻两个字符串即可。
def longest_common_prefix(arr):
arr = sorted(arr, key=len) # 按字符串长度从小到大排序
n = len(arr)
res = ''
for i in range(n-1):
s1, s2 = arr[i], arr[i+1]
p = ''
for j in range(min(len(s1), len(s2))):
if s1[j] == s2[j]:
p += s1[j]
else:
break
if len(p) > len(res):
res = p
return res
arr = ['abcdefg', 'abcd', 'abc', 'ab']
assert longest_common_prefix(arr) == 'ab'
arr = ['abcd', 'ab', 'ab', 'a']
assert longest_common_prefix(arr) == 'a'
arr = ['abcdefg', 'efg', 'fg', 'g']
assert longest_common_prefix(arr) == 'g'
排序的时间复杂度为 $O(n\log n)$,比较公共前缀的时间复杂度为 $O(n^2)$,因此总的时间复杂度为 $O(n^2)$。