функция для создания комбинаций строк - PullRequest
2 голосов
/ 04 июня 2011

Я приложу все усилия, чтобы описать то, что я пытаюсь выполнить:

Допустим, для каждой буквы у меня есть одна или несколько замен:

a = a
b = X, Z
c = c
d = W, V, M
e = e

Если яучитывая строку, скажем «abcd», я хочу создать строки с комбинациями замен, поэтому, например, «abcd» будет производить следующие комбинации:

aXcW
aXcV
aXcM
aZcW
aZcV
aZcM

Можете ли вы помочь мне написать функцию, которая будетвыплевывать массив всех комбинаций независимо от того, сколько замен на букву и сколько вхождений замен в строке?Так что он должен работать с ab и abbbdddd.

Спасибо

1 Ответ

1 голос
/ 04 июня 2011

вот вам простое рекурсивное решение

function repl($str, $map) {
    if(strlen($str) == 0)
        return array('');
    $out = array();
    foreach(repl(substr($str, 1), $map) as $r)
        foreach($map[$str[0]] as $sub)
            $out[] = $sub . $r;
    return $out;
}

используйте вот так

$map = array(
    'a' => array('1', '2', '3'),
    'b' => array('@', '*'),
    'c' => array('X', 'Y', 'Z')
);

$result = repl("abc", $map);

Для работы со строками utf8 (или произвольными подстроками) функция должна принимать массив строк:

function repl($chars, $map) {
    if(count($chars) == 0)
        return array('');
    $out = array();
    foreach(repl(array_slice($chars, 1), $map) as $r)
        foreach($map[$chars[0]] as $sub)
            $out[] = $sub . $r;
    return $out;
}

используйте вот так

preg_match_all('~.~u', $str, $m);
$chars = $m[0];
$result = repl($chars, $map);
...