代码改变世界

[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]