JSFiddle - React, Tailwind, and code Playground
JavaScript
var U = [6,1,5,3,4];
var S = [1,2,4,9,3,7,5];
var A = [null].concat(U.filter(function(x) { return S.indexOf(x) >= 0; }));
var B = [null].concat(S.filter(function(x) { return U.indexOf(x) < 0; }));
var n = A.length - 1, m = B.length - 1;
// build DP array
var f = [], next = []
for (var i = 0; i <= n; ++i) {
f[i] = [];
next[i] = [];
}
for (var j = 0; j <= m; ++j) {
f[0][j] = 0;
next[0][j] = 2;
}
for (var i = 1; i <= n; ++i) {
f[i][0] = f[i-1][0];
next[i][0] = 1;
for (var k = 1; k < i; ++k)
if (S.indexOf(A[i]) < S.indexOf(A[k]))
f[i][0]++;
for (var j = 1; j <= m; ++j) {
var x = f[i-1][j];
for (var k = 1; k < i; ++k)
if (S.indexOf(A[i]) < S.indexOf(A[k]))
x++;
for (var k = 1; k <= j; ++k)
if (S.indexOf(A[i]) < S.indexOf(B[k]))
x++;
var y = f[i][j-1];
for (var k = 1; k <= i; ++k)
if (S.indexOf(B[j]) < S.indexOf(A[k]))
y++;
for (var k = 1; k < j; ++k)
if (S.indexOf(B[j]) < S.indexOf(B[k]))
y++;
next[i][j] = (x<y) ? 1 : 2;
f[i][j] = Math.min(x, y);
}
}
// reconstruct solution
var res = [];
var i = n, j = m;
while (i > 0 || j > 0) {
if (next[i][j] == 1) {
res.push(A[i]);
i--;
} else {
res.push(B[j]);
j--;
}
}
res.reverse();
console.log(res);