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