Исключить определенные перестановки строки

0

Код изначально из этой темы.

Как исключить некоторые перестановки? Например, если я устанавливаю $ str на "heyy" и хочу, чтобы он исключил все перестановки с "yy" (два y вместе) в нем, как я мог это сделать?

Таким образом, он будет печатать, например, "hyey", но не "hyye".

mb_internal_encoding('UTF-8');

// function to generate and print all N! permutations of $str. (N = strlen($str)).
function permute($str,$i,$n)
{
    if ($i == $n)
    {
        print "$str\n";
    }
    else
    {
        for ($j = $i; $j < $n; $j++)
        {
            swap($str,$i,$j);
            permute($str, $i+1, $n);
            swap($str,$i,$j); // backtrack.
        }
    }
}

function swap(&$str,$i,$j) {
    $chars = array();
    for ($p = 0; $p < mb_strlen($str); $p++) {
        $chars[] = mb_substr($str, $p, 1);
    }
    $temp = $chars[$i];
    $chars[$i] = $chars[$j];
    $chars[$j] = $temp;
    $str = implode($chars);
}

$str = "heyy";

permute($str, 0, mb_strlen($str)); // call the function.

Заранее спасибо!

  • 1
    Реализация будет сильно зависеть от того, как вы определяете исключения. Будет ли это список запрещенных строк, регулярных выражений или более сложных правил. Затем вы можете применить исключения во время генерации или после вычисления перестановок.
  • 0
    Какой будет оптимальный путь? Я думал о том, чтобы просто сделать где-нибудь оператор if и получить список буквенных комбинаций, чтобы просто пропустить, но не знал, как это сделать, или если это вообще возможно.
Теги:
algorithm
permutation

1 ответ

1
Лучший ответ

Это то, что вы ищете?

function permute($str,$i,$n)
{
    if ($i == $n && strpos($str, 'yy') === false)    // note the extra condition
    {
        print "$str\n";
    }
    else
    {
        for ($j = $i; $j < $n; $j++)
        {
            swap($str,$i,$j);
            permute($str, $i+1, $n);
            swap($str,$i,$j); // backtrack.
        }
    }
}

Если это усложняется, вы также можете написать для него отдельную функцию (этот пример - перебирать список запрещенных подстрок):

$skip = array('yy', 'xx');

function valid_permutation($str)
{
    global $skip;
    // check all forbidden substrings
    foreach ($skip as $substring)
        if (strpos($str, $substring) !== false)
            return false;
    // no substring matches
    return true;
}

function permute($str,$i,$n)
{
    if ($i == $n && valid_permutation($str))
    {
        print "$str\n";
    }
    else
    {
        for ($j = $i; $j < $n; $j++)
        {
            swap($str,$i,$j);
            permute($str, $i+1, $n);
            swap($str,$i,$j); // backtrack.
        }
    }
}
  • 1
    Это именно то, что я ищу! :) Огромное спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню