Files
rose-ash/lib/ocaml/baseline/palindrome_part.ml
giles 2726ed9b8a
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 24s
ocaml: phase 5.1 palindrome_part.ml baseline (min cuts "aabba" = 1)
Two-phase palindrome-partition DP for the minimum-cuts variant:

  Phase 1: is_pal[i][j] palindrome table via length-major fill
           (single chars, then pairs, then expand inward).

  Phase 2: cuts[i] = 0 if s[0..i] is itself a palindrome,
                  = min over j of (cuts[j-1] + 1)
                    where s[j..i] is a palindrome.

  min_cut "aabba" = 1   ("a" | "abba")

Tests two sequential 2D DPs sharing the same is_pal matrix,
inline begin/end branches inside the length-major fill, mixed
bool and int 2D arrays.

181 baseline programs total.
2026-05-11 02:14:44 +00:00

36 lines
864 B
OCaml

let min_cut s =
let n = String.length s in
if n <= 1 then 0
else begin
let is_pal = Array.init n (fun _ -> Array.make n false) in
for i = 0 to n - 1 do is_pal.(i).(i) <- true done;
for len = 2 to n do
for i = 0 to n - len do
let j = i + len - 1 in
if s.[i] = s.[j] then begin
if len = 2 then is_pal.(i).(j) <- true
else is_pal.(i).(j) <- is_pal.(i + 1).(j - 1)
end
done
done;
let cuts = Array.make n 0 in
for i = 0 to n - 1 do
if is_pal.(0).(i) then cuts.(i) <- 0
else begin
let best = ref i in
for j = 1 to i do
if is_pal.(j).(i) then begin
let c = cuts.(j - 1) + 1 in
if c < !best then best := c
end
done;
cuts.(i) <- !best
end
done;
cuts.(n - 1)
end
;;
min_cut "aabba"