簡體   English   中英

如何根據字母變體數組獲取所有類似的字符串

[英]How to get all the similar strings based on an array of letter variations

我一直試圖將我的大腦包裹起來,但我正在有效地嘗試根據一系列字母變化生成給定字符串的所有變體的數組/列表。

我有字符串“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)

您的案例可以通過遞歸輕松實現。 這將是:

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 )。 '乘法'是指兩組的Decart乘積,然后是兩個部分的連接,即在某一對中。

如果您不介意使用嵌套函數,請嘗試以下操作:

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 )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM