0

スペースを含む文字列があります。それを分割 (分解) し、そこからシーケンスのすべてのバリアントを取得する必要があります。例えば:

文字列1 文字列2 文字列3

それを解析して、次のような出力を取得する必要があります。

文字列1 文字列2 文字列3
文字列1 文字列3 文字列2
文字列2 文字列1 文字列3
文字列2 文字列3 文字列1
文字列3 文字列2 文字列1
文字列3 文字列1 文字列2

これを行う最も効率的な方法は何ですか?
編集: 実際には、最大 3 つの文字列を解析する必要があります。だから私はこれをきれいな方法ではありません(ハードコードされています):

$exploded_query = expand(' ', $query);
if(count($exploded_query) == 2) {
//2 バリアント
}
if(count($exploded_query) == 3) {
//6 バリアント
}

だから私はそれを行うためのきれいな方法を探しています。

4

2 に答える 2

1

配列の順列です

ここを見てください - > Finding All Permutations of an Array、それはあなたを助けます。

于 2013-04-09T13:36:14.163 に答える
0

これが効率的または最適であると主張しているわけでは決してありません。そこにはもっと良い解決策があります。しかし、これはあなたの質問に対する直接的な答えです。肥大化を取り除きたい場合は (少しパフォーマンスが低下する可能性があります)、getRemainingWords関数呼び出しを次のように置き換えることができます。

$index = 0;
array_values(array_filter($words, function($key, &$index) { return !($key == $index++); }));

それ以外の場合は、ここにあります

function getPossibleCombinations($words) {
    $combinations = array();
    $count = count($words);

    // Base case: if there's only 1 word, there's only one combination
    if ($count == 1) {
        return array($words);
    }

    // Otherwise, loop over each words
    foreach ($words as $key=>$word) {

        // For each item, get all of the remaining items in the array (all except the current one)
        $otherWords = getRemainingWords($words, $key);

        // And recursively permute them
        $otherCombinations = getPossibleCombinations($otherWords);
        foreach ($otherCombinations as $otherCombination) {
            $combinations[] = array_merge(array($word), $otherCombination);
        }
    }

    return $combinations;
}


function getRemainingWords($array, $index) {
    $results = array();

    foreach ($array as $key=>$value) {
        if ($key == $index) {
            continue;
        }

        $results[] = $value;
    }

    return $results;
}
于 2013-04-09T13:08:46.743 に答える