[LeetCode] 1143. Longest common subsequences_ Medium tag: Dynamic Programming
2019-04-28 02:27 Johnson_强生仔仔 阅读(264) 评论(0) 编辑 收藏 举报Given two strings, find the longest common subsequence (LCS).
Example
Example 1: Input: "ABCD" and "EDCA" Output: 1 Explanation: LCS is 'A' or 'D' or 'C' Example 2: Input: "ABCD" and "EACB" Output: 2 Explanation: LCS is "AC"
这个题目思路是利用dynamic programming,用二维的,mem[l1 + 1][l2 + 1] # mem[i][j] 去表示s1的前i个characters与s2的前j个characters的LCS的length。
function : mem[i][j] = max(mem[i][j - 1], mem[i - 1][j]) if s1[i - 1] != s2[j - 1]
max(mem[i][j - 1], mem[i - 1][j], mem[i - 1][j - 1] + 1) if s1[i - 1] == s2[j - 1]
initialize : mem[i][0] = mem[0][j] = 0
Update 06/21/2021 , using rolling array to decrease the Sapce from S: O(m * n) -> O(n)
Code:
class Solution: def LCS(self, s1, s2): l1, l2 = len(s1), len(s2) mem = [[0] * (l2 + 1) for _ in range(l1 + 1)] for i in range(1, l1 + 1): for j in range(1, l2 + 1): temp = 1 if s1[i - 1] == s2[j - 1] else 0: mem[i][j] = max(mem[i - 1][j], mem[i][j - 1], mem[i - 1][j - 1] + temp)
return mem[l1][l2]
Code 2: T: O(m * n), S:O(n)
class Solution: def LCS(self, s1, s2): l1, l2 = len(s1), len(s2) mem = [[0] * (l2 + 1) for _ in range(2)] for i in range(1, l1 + 1): for j in range(1, l2 + 1): temp = 1 if s1[i - 1] == s2[j - 1] else 0: mem[i%2][j] = max(mem[(i - 1)%2][j], mem[i%2][j - 1], mem[(i - 1)%2][j - 1] + temp) return mem[l1%2][l2]