Categories

  • String
  • Dynamic Programming

Templates

package string.recursive;

import java.util.Arrays;

public class LongestCommonSubsequence {

    public int longestCommonSubsequence(String a, String b) {
        int[][] memo = new int[a.length()][b.length()];
        Arrays.stream(memo).forEach(row -> Arrays.fill(row, Integer.MIN_VALUE));
        return dfs(a, b, memo, 0, 0);
    }

    private int dfs(String a, String b, int[][] memo, int ptrA, int ptrB) {
        if (ptrA == a.length() || ptrB == b.length())
            return 0;

        if (memo[ptrA][ptrB] != Integer.MIN_VALUE)
            return memo[ptrA][ptrB];

        if (a.charAt(ptrA) == b.charAt(ptrB))
            return memo[ptrA][ptrB] = dfs(a, b, memo, ptrA + 1, ptrB + 1) + 1;

        int subA = dfs(a, b, memo, ptrA + 1, ptrB);
        int subB = dfs(a, b, memo, ptrA, ptrB + 1);
        return memo[ptrA][ptrB] = Math.max(memo[ptrA][ptrB], Math.max(subA, subB));
    }

}

Type to search.