LeetCode-in-All

1143. Longest Common Subsequence

Medium

Given two strings text1 and text2, return the length of their longest common subsequence. If there is no common subsequence, return 0.

A subsequence of a string is a new string generated from the original string with some characters (can be none) deleted without changing the relative order of the remaining characters.

A common subsequence of two strings is a subsequence that is common to both strings.

Example 1:

Input: text1 = “abcde”, text2 = “ace”

Output: 3

Explanation: The longest common subsequence is “ace” and its length is 3.

Example 2:

Input: text1 = “abc”, text2 = “abc”

Output: 3

Explanation: The longest common subsequence is “abc” and its length is 3.

Example 3:

Input: text1 = “abc”, text2 = “def”

Output: 0

Explanation: There is no such common subsequence, so the result is 0.

Constraints:

Solution

(define (dp-ref dp i j)
  (vector-ref (vector-ref dp i) j))
(define (dp-set! dp i j val)
  (vector-set! (vector-ref dp i) j val))

(define (longest-common-subsequence text1 text2)
  (begin
    (define dp (make-vector (+ (string-length text1) 1)))
    (for ([i (+ (string-length text1) 1)])
      (vector-set! dp i (make-vector (+ (string-length text2) 1))))
    (for ([s1 text1]
          [i (string-length text1)])
      (for ([s2 text2]
            [j (string-length text2)])
        (if (eq? s1 s2)
            (dp-set! dp (add1 i) (add1 j) (add1 (dp-ref dp i j)))
            (dp-set! dp (add1 i) (add1 j) (max (dp-ref dp (add1 i) j) (dp-ref dp i (add1 j)))))))
    (dp-ref dp (string-length text1) (string-length text2))))