CODE

class Solution:
    def longestCommonSubsequence(self, text1: str, text2: str) -> int:
        # Good explanation: https://leetcode.com/problems/longest-common-subsequence/discuss/351689/JavaPython-3-Two-DP-codes-of-O(mn)-and-O(min(m-n))-spaces-w-picture-and-analysis
        if len(text1) > len(text2):
            # Text 1 should always be small
            return self.longestCommonSubsequence(text2, text1)
        
        dp = [[0 for _ in range(len(text1) + 1)] for _ in range(2)]
        prev_row, curr_row = 0, 1
        for i in range(len(text2)):
            for j in range(1, len(text1) + 1):
                if text1[j - 1] == text2[i]:
                    dp[curr_row][j] = 1 + dp[prev_row][j - 1]
                else: 
                    dp[curr_row][j] = max(dp[curr_row][j - 1], dp[prev_row][j])
            # Make the current state available in next iteration
            prev_row, curr_row = curr_row, prev_row
        # Prev row because they are swapped after the iteration
        return dp[prev_row][-1]
                    
                
                
            
        
        

Last updated