创建给定单词中每个字母的上/下排列


Create permutation of each letter in upper/lower from a given word

我需要构建一个函数-我不知道PHP上是否已经存在这个函数-为给定的单词创建尽可能多的唯一字母排列。举个例子:

#English
word: hello
output: HEllo, HEEllo, HEELlo, HEELLo, HELLO, Hello, HeLlo, HeLLo and so on 
#Spanish
word: hola
output: hola, Hola, HOla, HOLa, HOLA, hOla, hOLa, hOLA and so on 

我怎样才能做到这一点?有人能给我提供一个算法来实现这一点吗?

注意:请记住,单词可以是英语或西班牙语!

一种潜在的方法如下(在伪代码中):

  • 假设:输入仅为英文字母表,小写
  • 计算字符串长度,并创建一个counter积分,它是字符串长度的2次方。(例如:"hello"为5个字符,counter为32个字符)
  • 从0循环到counter-1,生成字符串长度中该整数的二进制表示。(单词"hello"的IE/是从"00000"循环到"11111"
  • 每次迭代,用当前计数的二进制表示映射单词,当字符的位置有"1"时,将其转换为大写。(示例:在第4次迭代00011中,结果应为"helLO")

代码:

function permutationWords($input) {
    $input = strtolower($input);
    $results = [];
    $length = strlen($input);
    $counter = pow(2, $length);
    for($i=0; $i<$counter; $i++) {
        $binaryStr = str_pad(decbin($i), $length, '0', STR_PAD_LEFT);
        $variant = '';
        for($j=0; $j<$length; $j++) {
            $variant .= ($binaryStr[$j] == '1') ? strtoupper($input[$j]) : $input[$j];
        }
        $results[] = $variant;
    }
    return $results;
}

PhpFiddle

肯定存在优化甚至更有效的方法的空间。