算路:分治
- 假如我只有两个字符串需要进行比较,那么算法是简单的,只要按部就班逐位比较即可
- 如果不分治,那么也不困难,不断得到
prefix
和下一个进行比较就行 - 分治的关键在于把大规模的问题缩减成小规模。
- 可以把字符串数组分成两部分,左边的公共前缀
left_prefix
和右边的公共前缀right_prefix
,那么只需要比较左右两边即可,利用递归可以实现。 - 算法里用了嵌套函数,可以看看。
代码:
class Solution:
# 分治算法实现
def longestCommonPrefix(self, strs: List[str]) -> str:
def lcp(begin_pos:int, end_pos:int)->str:
if end_pos == begin_pos:
return strs[begin_pos]
mid = (begin_pos + end_pos) // 2
# 此时已经得到了左右两部分别的公共前缀
left_prefix, right_prefix = lcp(begin_pos, mid), lcp(mid + 1, end_pos)
# 希望得到当前的公共前缀
min_len = min(len(left_prefix), len(right_prefix))
prefix_index = 0
for i in range(min_len + 1):
if i == min_len:
prefix_index = min_len
else:
if left_prefix[i] != right_prefix[i]:
prefix_index = i
break
return left_prefix[:prefix_index]
return lcp(0, len(strs) - 1)