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

时间:2015-12-09 03:21:40

标签: php algorithm

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

parent/foo/src/main/java/com/foo/service/
foo/src/main/java/com/foo/service/

我怎么能做到这一点?能为我提供一个算法来实现这个目标吗?

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

1 个答案:

答案 0 :(得分:3)

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

  • 假设:输入仅为英文字母,小写。
  • 计算字符串长度并创建counter积分为2的字符串长度。 (例如:'你好'是5个字符而counter是32)。
  • 从0循环到counter-1,在字符串长度中生成此整数的二进制表示。 (IE /单词'hello'是从'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

绝对有优化空间或更有效的方法。