Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 26s
Classic 2D DP for longest common subsequence, optimized to use
two rolling 1D arrays (prev / curr) for O(min(m,n)) space:
for i = 1 to m do
for j = 1 to n do
if s1.[i-1] = s2.[j-1] then curr.(j) <- prev.(j-1) + 1
else if prev.(j) >= curr.(j-1) then curr.(j) <- prev.(j)
else curr.(j) <- curr.(j-1)
done;
for j = 0 to n do prev.(j) <- curr.(j) done
done;
prev.(n)
lcs "ABCBDAB" "BDCAB" = 4
Two valid LCS witnesses: BCAB and BDAB.
Avoids Array.make_matrix (not in our runtime) by manual rolling.
142 baseline programs total.
24 lines
498 B
OCaml
24 lines
498 B
OCaml
let lcs s1 s2 =
|
|
let m = String.length s1 in
|
|
let n = String.length s2 in
|
|
let prev = Array.make (n + 1) 0 in
|
|
let curr = Array.make (n + 1) 0 in
|
|
for i = 1 to m do
|
|
for j = 1 to n do
|
|
if s1.[i - 1] = s2.[j - 1] then
|
|
curr.(j) <- prev.(j - 1) + 1
|
|
else if prev.(j) >= curr.(j - 1) then
|
|
curr.(j) <- prev.(j)
|
|
else
|
|
curr.(j) <- curr.(j - 1)
|
|
done;
|
|
for j = 0 to n do
|
|
prev.(j) <- curr.(j)
|
|
done
|
|
done;
|
|
prev.(n)
|
|
|
|
;;
|
|
|
|
lcs "ABCBDAB" "BDCAB"
|