Adloun

La plus longue sous-suite commune : rendre le mot, pas sa longueur

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 17 — Programmation dynamique

Énoncé

Le chapitre calcule la longueur de la plus longue sous-suite commune. Écrire la fonction qui rend le mot lui-même, et l'appliquer à PROGRAMME et GRAMMAIRE.

Corrigé

On remonte la table depuis la case , exactement comme on remonte celle du sac : On note table_plsc la fonction plsc du chapitre, modifiée pour rendre la table entière au lieu de sa seule dernière case.


(* Renvoie une plus longue sous-suite commune a u et v (le MOT).
   Precondition : la table l a ete remplie comme dans le chapitre.
   Complexite : Theta(n + m) apres le remplissage, qui coute Theta(nm). *)
let plsc_mot u v =
  let l = table_plsc u v in
  let b = Buffer.create 16 in
  let i = ref (String.length u) and j = ref (String.length v) in
  (* VARIANT : i + j, qui decroit strictement a chaque tour. *)
  while !i > 0 && !j > 0 do
    if u.[!i-1] = v.[!j-1] then begin
      Buffer.add_char b u.[!i-1]; decr i; decr j      (* lettre commune *)
    end else if l.(!i-1).(!j) >= l.(!i).(!j-1) then decr i
    else decr j
  done;
  let s = Buffer.contents b in
  String.init (String.length s) (fun k -> s.[String.length s - 1 - k])

Mesure :


PLSC PROGRAMME / GRAMMAIRE = 6, mot = GRAMME
PLSC ALGORITHME / LOGARITHME = 8, mot = LGRITHME

Trois remarques de méthode.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.