题解 | 最长公共子序列(二)
class Solution: def LCS(self, s1: str, s2: str) -> str: # 去除字符串中的空格、换行符和逗号 s1 = ''.join([char for char in s1 if char not in (' ', '\n', ',')]) s2 = ''.join([char for char in s2 if char not in (' ', '\n', ',')]) # 如果任意一个字符串为空,直接返回 -1 if not s1 or not s2: return "-1" # 获取两个字符串的长度 m, n = len(s1), len(s2) # 创建一个二维数组 dp 用于记录公共子序列的长度 dp = [[0] * (n + 1) for _ in range(m + 1)] # 填充 dp 数组 for i in range(1, m + 1): for j in range(1, n + 1): if s1[i - 1] == s2[j - 1]: # 如果当前字符相等,则公共子序列长度加 1 dp[i][j] = dp[i - 1][j - 1] + 1 else: # 如果当前字符不相等,则取上方和左方的最大值 dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) # 如果最长公共子序列长度为 0,返回 -1 if dp[m][n] == 0: return "-1" # 回溯构建最长公共子序列 result = [] i, j = m, n while i > 0 and j > 0: if s1[i - 1] == s2[j - 1]: # 如果当前字符相等,将其添加到结果中,并向左上方移动 result.append(s1[i - 1]) i -= 1 j -= 1 elif dp[i - 1][j] > dp[i][j - 1]: # 如果上方的值更大,向上移动 i -= 1 else: # 如果左方的值更大,向左移动 j -= 1 # 反转结果列表并转换为字符串 result.reverse() return ''.join(result)
逆天豆包