3

私はこれに頭を悩ませようとしていますが、文字のバリエーションの配列に基づいて、特定の文字列のすべてのバリエーションの配列/リストを効果的に生成しようとしています。

文字列「fabien」があり、関連する各文字のバリエーションの配列があります。たとえば、A は 4 に置き換え可能で、i は 1 と l に置き換え可能です。したがって、「fabien」のすべてのバリエーションのリストを生成するにはどうすればよいかという情報が与えられます。

$variants = array();
$variants['a'] = array('4');
$variants['i'] = array('1', 'l');

$string = 'fabien';

$result = getVariants('fabien', $variants);

print_r($results);

// Sample output:
Array ([0] => fabien [1] => f4bien [2] => fab1en [3] => fablen [4] => f4b1en [5] => f4blen)
4

2 に答える 2

3

ケースは再帰で簡単に実装できます。それは次のようになります:

function getVariants($string, $variants)
{
    //here's about stripping 1 symbol from string's right, so 
    //may be you'll prefer to work with string functions:
    $string  = is_array($string)?$string:str_split($string);
    $symbol  = array_pop($string);
    $variant = array_key_exists($symbol, $variants)?
               array_merge([$symbol], $variants[$symbol]):
               [$symbol];
    $result  = [];
    if(!count($string))
    {
        return $variant;
    }
    foreach(getVariants($string, $variants) as $piece)
    {
        foreach($variant as $char)
        {
            $result[] = $piece.$char;
        }
    }
    return $result;
}

-フィドルのデモを参照してください。これはどのように機能していますか?答えは次のとおりです。長さのある文字列Nのバリエーションは、その記号のない部分のバリエーション (つまり、長さのあるものN-1) に「乗算」された正しい記号のバリエーションです。「乗算」とは、2 つのセットの Decart 積と、特定のペアになっている 2 つの部分の連結を意味します。

于 2013-11-09T11:28:08.853 に答える
1

ネストされた関数を使用してもかまわない場合は、以下を試してください。

function getVariants($string, $variants)
{
    // Store extra params for the recusion
    function _getVariants($string, $variants, $batch, $i, &$results)
    {
        if ($i >= strlen($string))
        {
            $results[] = $batch;
        }
        else
        {
            $character = $string[$i];

            // By default, just concat the current character
            _getVariants($string, $variants, $batch . $character, $i + 1, $results);

            if ( ! empty($variants[$character]))
            {
                // If there is something to replace
                foreach ($variants[$character] as $character)
                {
                    // Concat the replaced character
                    _getVariants($string, $variants, $batch . $character, $i + 1, $results);
                }
            }
        }
    }

    $results = array();
    _getVariants($string, $variants, '', 0, $results);
    return $results;
}

出力:

Array ( [0] => fabien [1] => fab1en [2] => fablen [3] => f4bien [4] => f4b1en [5] => f4blen )
于 2013-11-09T04:41:56.310 に答える