题解 | #最长公共子序列(二)#
最长公共子序列(二)
https://www.nowcoder.com/practice/6d29638c85bb4ffd80c020fe244baf11
class Solution:
def LCS(self , s1: str, s2: str) -> str:
# 获取最长公共子序列长度
dp = [[0]*(len(s2)+1) for _ in range(len(s1)+1)]
for i in range(1, len(s1)+1):
for j in range(1, len(s2)+1):
if s1[i-1] == s2[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i][j-1], dp[i-1][j])
# 获取字符串
res = ""
i = len(s1)
j = len(s2)
while i > 0 and j > 0:
if s1[i-1] == s2[j-1]: # 对角
res += s1[i-1]
i -= 1
j -= 1
elif dp[i][j-1] > dp[i-1][j]: # 上大于左
j -= 1
else: # 左大于上
i -= 1
if not res:
return -1
return res[::-1]
解题思路
1.先利用动态规划获取最长子序列的长度:
- 如果当两个字符串的元素相等的时候,状态转移方程为:dp[i][j] = dp[i-1][j-1] + 1;
- 否则为dp[i][j] = max(dp[i][j-1], dp[i-1][j])。
2.根据第一步,从后往前获取字符,得到最长子序列的字符串结果。
复杂度
时间复杂度和空间复杂度都为O(mn)。
