PHP中的缩写排列

时间:2013-09-17 21:08:34

标签: php algorithm

我正在尝试编写一个小例程,负责置换字符串的所有可能缩写。此字符串是全名,以空格分隔。像这样:

James Mitchell Rhodes

我想输出:

J. Mitchell Rhodes
James M. Rhodes
J. M. Rhodes

等等......但是,我还要考虑“停用词”:

James the Third Rhodes

我想输出:

J. the Third R.
James The Third R.

这有一个已知的算法吗?我一直试图解决这个问题很长一段时间了。

更新:让数组中的每个单词变得容易。只是爆炸('',$ string)然后是array_map,以考虑in_array($ word,$ stopWordsMap)排除停用词。这不是问题,也不是问题的焦点。问题是如何发现可能的原始单词(O)和缩写单词(A)的组合:

O A A
O A O
O A A
A A A
O O O

2 个答案:

答案 0 :(得分:2)

第一直觉是用for循环迭代二进制排列,即,去除停用词(如果你愿意,记住它们的位置),2 ^ numOfRemainingElements,AND出状态(意思是缩写或不是)每个字:

$names = array('James', 'Earl', 'Jones');
$nameCount = count($names);
$permCount = pow(2, $nameCount);

for ($p = 1; $p < $permCount; $p++) {
    for ($n = 0; $n < $nameCount; $n++) {
        echo $p & pow(2, $n) ? $names[$n][0] . '.' : $names[$n];
        echo ' ';
    }
    echo "\n";
}

/* output:

J. Earl Jones 
James E. Jones 
J. E. Jones 
James Earl J. 
J. Earl J. 
James E. J. 
J. E. J. 

*/

你可以进一步调整它,但你可以看到我的目标。

答案 1 :(得分:1)

我不会写完整的代码,因为你说置换不是问题。这是关于确定哪些词汇可以置换所有场景。

我不得不考虑二进制系统,如果你希望拥有n个输入的函数的所有可能输入,那么请继续使用xD,你需要2 ^ n个输入场景。

所以你输入的2个输入

0 0
0 1
1 0
1 1

好吗?我们可以在php中使用

将其作为数组
$map = array();
$inputs = 2;
for($i=0;$i<=2^$inputs;$i++){
    $bin = decbin($i);  // returns string
    $array = preg_split('//', $bin, -1, PREG_SPLIT_NO_EMPTY); // but i want a array
    $map[] = $array;
}

现在,如果您要置换的字符串有三个单词,请将它们视为三个输入,然后所有$ map行告诉您每次获取哪个单词以获取所有可能的字符串,如果该行中的第一个项目是0,不要置换第一个单词,如果它是1置换第一个单词,依此类推......

以下是您的示例

的所有行和结果字符串
0 0 0  James Mitchell Rhodes
0 0 1  James Mitchell R,
0 1 0  James M. Rhodes
0 1 1  James M. R.
1 0 0  J. Mitchell Rhodes
1 0 1  J. Mitchell R.
1 1 0  J. M. Rhodes
1 1 1  J. M. R