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.