基于字母变体数组,如何获取所有相似的字符串

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)
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;
}

-请查看fiddle演示。这是如何工作的?答案是:长度为N的字符串变化是它右侧符号的变化与不包含该符号部分的变化(即长度为N-1)的“乘积”。通过“乘法”,我指两个集合的笛卡尔积,然后连接在一起的两个部分,这些部分在某些对中。

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 )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接