1

文字列のすべての可能な省略形を並べ替えることを担当する小さなルーチンを作成しようとしています。この文字列は、スペースで区切られた完全な名前です。このような:

James Mitchell Rhodes

出力したい:

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

など...ただし、「ストップワード」も考慮する必要があります。

James the Third Rhodes

出力したい:

J. the Third R.
James The Third R.

これには既知のアルゴリズムがありますか? 私はかなり長い間、この問題を解決しようとしてきました。

更新: 各単語を配列に入れるのは簡単です。destroy(' ', $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
4

2 に答える 2

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. 

*/

さらに微調整することもできますが、私がどこに向かっているのかがわかります。

于 2013-09-17T21:41:07.807 に答える
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;
}

並べ替えたい文字列に 3 つの単語がある場合、それらを 3 つの入力と見なし、すべての $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
于 2013-09-17T21:40:26.540 に答える