2 votes

php génère des combinaisons de chaînes de caractères pour les lettres manquantes

J'ai quelques mots, disons BKOO. Je dois supprimer toutes les combinaisons de lettres manquantes pour générer des sous-mots de ce mot initial. D'abord, il faut enlever une seule lettre, puis n'importe quelle lettre pour construire des mots d'au moins 2 lettres.

Donc, dans notre exemple, cela signifie faire des mots comme KOO, BOO, OO, BK, BO.

Mon algorithme actuel indique qu'il est possible de générer 7 combinaisons à partir de BKOO. (J'inclus également le mot initial).

Array
(
    [0] => BKOO
    [1] => Array
        (
            [0] => BKOO
            [1] => KOO
            [2] => OO
            [3] => KO
            [4] => BOO
            [5] => BO
            [6] => BKO
            [7] => BK
        )

)

Notez qu'il n'y a pas de mots comme BOK ou OOK parce que cela signifierait faire le réordonnancement, mais je ne veux pas faire cela. Je veux juste laisser les lettres hors du mot actuel, et ne pas faire de réorganisation.

Le problème, c'est que c'est très lent pour une longueur de 15 minutes. Ça prend une éternité. Comment l'accélérer ?

function comb($s, $r = [], $init = false) {

  if ($init) {
    $s = mb_strtoupper($s);
    $r[] = $s;
  }

  $l = strlen($s);
  if (!$s || $l < 3) return [];
  for ($i=0; $i<$l; $i++) {
      $t = rem_index($s, $i);
      $r[] = $t;

      $r = array_merge($r, comb($t));
  }
  $ret = array_unique((array)$r);
  return $init ? array_values($ret) : $ret;
}

// remove character at position
function rem_index($str, $ind)
{ 
   return substr($str,0,$ind++). substr($str,$ind);
}

$s = 'BKOO';
print_r(comb($s, [], true));

https://www.tehplayground.com/62pjCAs70j7qpLJj

SECTION NERD :

Note intéressante : j'ai d'abord pensé générer un tableau d'indices de suppression, par exemple, supprimer d'abord une seule lettre, donc supprimer 0, puis 1, etc., puis des combinaisons de 2 lettres, donc supprimer 1 et 2, 1 et 3, etc., mais ensuite j'ai pensé qu'il serait assez difficile de supprimer N lettres d'une chaîne de caractères en une seule fois. Le problème est que c'est très lent pour une raison quelconque.

Si vous avez aussi des connaissances en mathématiques, quelle est l'équation pour calculer les combinaisons résultantes ? Pour moi, le calcul approximatif est, disons, pour un mot de 15 lettres, 14 * 13 * 12 ou, du moins, il fait une telle itération, mais cela représenterait des millions de combinaisons et, évidemment, ce n'est pas le cas même pour des mots plus courts comme 8.

Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X