我需要构建一个函数-我不知道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
肯定存在优化甚至更有效的方法的空间。