export function longestCommonSubsequence(a: string, b: string) {
  const lengths: number[][] = [];
  for (let i = 0; i <= a.length; i++) {
    lengths[i] = [];
    for (let j = 0; j <= b.length; j++) {
      if (i === 0 || j === 0) {
        lengths[i][j] = 0;
      } else if (a[i - 1] === b[j - 1]) {
        lengths[i][j] = lengths[i - 1][j - 1] + 1;
      } else {
        lengths[i][j] = Math.max(lengths[i - 1][j], lengths[i][j - 1]);
      }
    }
  }
  let result = "";
  let x = a.length;
  let y = b.length;
  while (x !== 0 && y !== 0) {
    if (lengths[x][y] === lengths[x - 1][y]) {
      x--;
    } else if (lengths[x][y] === lengths[x][y - 1]) {
      y--;
    } else {
      result = a[x - 1] + result;
      x--;
      y--;
    }
  }
  return result;
}