📅  最后修改于: 2023-12-03 15:28:41.408000             🧑  作者: Mango
门| GATE-CS-2002 |第 43 题
设 $P = B_1B_2 \cdots B_m$ 和 $Q = A_1A_2 \cdots A_n$ 是两个字符串,各包含 $m$ 和 $n$ 个字符。这两个字符串的最长公共后缀(LCS)是一个字符串 $Z = C_1C_2 \cdots C_k$,满足 $Z$ 是 $P$ 和 $Q$ 的后缀,并且没有比 $k$ 更长的公共后缀。设计一个时间复杂度为 $\Theta(m+n)$ 的算法,来寻找 $P$ 和 $Q$ 的最长公共后缀。
假设 $P = $ ccababc
,$Q =$ babccababc
则 $P$ 和 $Q$ 的最长公共后缀为 abc
。
这道题可以通过比较两个字符串 $P$ 和 $Q$ 的后缀来找到最长公共后缀。
首先,将 $P$ 和 $Q$ 翻转,这样我们就可以在两个字符串的开始处比较它们的后缀。比较两个字符串的后缀,通过指针移动,分为三种情况:
def lcp(string1: str, string2: str) -> str:
"""
:param string1: 待比较字符串1
:param string2: 待比较字符串2
:return: 字符串1和字符串2的最长公共后缀
"""
# 翻转两个字符串
string1_reverse = string1[::-1]
string2_reverse = string2[::-1]
# 找到两个字符串的最短长度
length = min(len(string1), len(string2))
# 比较两个字符串的后缀
for i in range(length):
if string1_reverse[i] != string2_reverse[i]:
return string1_reverse[:i][::-1]
return string1_reverse[:length][::-1]
假设字符串 $P$ 的长度为 $m$,字符串 $Q$ 的长度为 $n$,则该算法的时间复杂度为 $\Theta(\min(m,n))$,空间复杂度为 $\Theta(1)$。
本题通过比较两个字符串的后缀,利用指针的移动计算公共后缀的长度,时间复杂度为 $\Theta(\min(m,n))$。