UNPKG

@technobuddha/library

Version:
50 lines (49 loc) 1.55 kB
import create2DArray from '../create2DArray'; /** * Implementation of Longest Common Subsequence problem. * http://en.wikipedia.org/wiki/Longest_common_subsequence * * Returns the longest possible array that is subarray of both of given arrays. * * @param array1 First array of objects. * @param array2 Second array of objects. * @param __namedParameters see {@link Options} * @default compare equality comparison * @default collect basic collector * @returns A list of objects that are common to both arrays * such that there is no common subsequence with size greater than the * length of the list. */ export function longestCommonSubsequence(array1, array2, { compare = (a, b) => a === b, collect = (i1, _i2) => array1[i1] } = {}) { const l1 = array1.length; const l2 = array2.length; const c = create2DArray(l1 + 1, l2 + 1, 0); let i; let j; for (i = 1; i <= l1; i++) { for (j = 1; j <= l2; j++) { if (compare(array1[i - 1], array2[j - 1])) c[i][j] = c[i - 1][j - 1] + 1; else c[i][j] = Math.max(c[i - 1][j], c[i][j - 1]); } } const result = []; i = l1; j = l2; while (i > 0 && j > 0) { if (compare(array1[i - 1], array2[j - 1])) { result.unshift(collect(i - 1, j - 1)); i--; j--; } else if (c[i - 1][j] > c[i][j - 1]) { i--; } else { j--; } } return result; } export default longestCommonSubsequence;