【问题标题】:Abbreviation permutation in PHPPHP中的缩写排列
【发布时间】:2013-09-17 21:08:34
【问题描述】:

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

James Mitchell Rhodes

我要输出:

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

等等……但是,我还必须考虑“停用词”:

James the Third Rhodes

我要输出:

J. the Third R.
James The Third R.

对此有已知的算法吗?一段时间以来,我一直在努力解决这个问题。

更新:在数组中包含每个单词非常容易。只需explode(' ', $string) 然后array_map,排除停用词考虑in_array($w​​ord, $stopWordsMap)。这不是问题,也不是问题的重点。问题是如何发现可能的原始词(O)和缩写词(A)的组合:

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

【问题讨论】:

  • 不,不会有一个众所周知的算法来解决这个问题,因为解决方案是非常简单的字符串操作。
  • 您愿意分享您对这种微不足道的字符串操作的解决方案吗?
  • 在空间上爆炸,忽略停用词,循环。听起来不难,你在哪里卡住了
  • 我认为生成排列“更难”,而不是字符串操作。
  • @Dagon 我会以相反的顺序来做:删除停用词,在空间上爆炸等;)

标签: php algorithm


【解决方案1】:

第一直觉是用 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. 

*/

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

【讨论】:

  • 哇,这真的很优雅,第三行应该是 $permCount = pow(2, $nameCount) 并且它是完美的。
  • @joschua011:感谢您的赞美和建议(我已将其纳入)。
【解决方案2】:

我不会写完整的代码,因为你说置换不是问题。这是关于找出在所有场景中要置换的单词。

我不得不考虑二进制系统,如果你想拥有一个具有 n 个输入的函数的所有可能输入,你需要 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

【讨论】:

    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2015-12-31
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多