题解 | #最长公共子序列(二)#
最长公共子序列(二)
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)。