Есть строка из определённых уникальных символов, нужно получить все возможные уникальные последовательности из этих символов, в том числе, исключая каждый символ. Вхождение символа в строке от нуля до одного раза. Позиция символа в строке не играет роли в уникальности, то есть
VUCADE
и
DAVUCE
- это одинаковые строки. Решил писать функцию, писал, пока в голову ни пришла мысль - "а вдруг я изобретаю велосипед???". На скорую руку набросал:
// $str - набор сиволов
// $withoutNum - количество исключённых символов
// $arr - ссылка на массив, куда буду записывать комбинации строк
// $idling - количество "порожняковых" работ
function combinations($str, $withoutNum, &$arr, &$idling = 0){
$len = strlen($str); // длина строки
$withoutPos = 0; // позиция исключённого символа
if(!$str or ($withoutPos > $len) or($withoutNum + $withoutPos >= $len)) return;
while($len--){
$nstr = substr($str, 0, $withoutPos) . substr($str, $withoutPos + $withoutNum);
if(isset($arr[$nstr])) $idling++;
else {
$arr[$nstr] = true; // запишу строку в индекс, чтобы было легче найти
combinations($nstr, $withoutNum + 1, $arr, $idling);
}
if($withoutPos++ + $withoutNum === 0) break;
}
combinations($str, $withoutNum + 1, $arr, $idling);
}
$str = 'VUCADE';
combinations($str, 0, $arr, $idling);
$str_list = array_keys($arr); // тут будет список полученных строк
var_dump($str_list);array(49) {
[0]=>
string(6) "VUCADE"
[1]=>
string(5) "UCADE"
[2]=>
string(3) "ADE"
[3]=>
string(3) "UDE"
[4]=>
string(3) "UCE"
[5]=>
string(3) "UCA"
[6]=>
string(4) "UCAD"
[7]=>
string(1) "D"
[8]=>
string(1) "U"
[9]=>
string(2) "UC"
[10]=>
string(2) "DE"
[11]=>
string(2) "UE"
[12]=>
string(1) "E"
[13]=>
string(5) "VCADE"
[14]=>
string(3) "VDE"
[15]=>
string(3) "VCE"
[16]=>
string(3) "VCA"
[17]=>
string(4) "VCAD"
[18]=>
string(1) "V"
[19]=>
string(2) "VC"
[20]=>
string(2) "VE"
[21]=>
string(5) "VUADE"
[22]=>
string(3) "VUE"
[23]=>
string(3) "VUA"
[24]=>
string(4) "VUAD"
[25]=>
string(2) "VU"
[26]=>
string(5) "VUCDE"
[27]=>
string(3) "CDE"
[28]=>
string(3) "VUC"
[29]=>
string(4) "VUCD"
[30]=>
string(5) "VUCAE"
[31]=>
string(3) "CAE"
[32]=>
string(3) "VAE"
[33]=>
string(4) "VUCA"
[34]=>
string(1) "A"
[35]=>
string(2) "AE"
[36]=>
string(5) "VUCAD"
[37]=>
string(3) "CAD"
[38]=>
string(3) "VAD"
[39]=>
string(3) "VUD"
[40]=>
string(2) "AD"
[41]=>
string(2) "VD"
[42]=>
string(4) "CADE"
[43]=>
string(1) "C"
[44]=>
string(2) "CA"
[45]=>
string(4) "VADE"
[46]=>
string(2) "VA"
[47]=>
string(4) "VUDE"
[48]=>
string(4) "VUCE"
}
Так вот... Есть что побыстрее (моя функция вычислила 143 повторяющихся строки) и надёжней ((для строки VUCADE, то есть, для 6-ти символов, у меня вышло 49 строк))? Как рассчитать количество возможных строк, удовлетворяющих моему условию... имею ввиду формулу математическую?