我想说BKOO。 我需要删除丢失字母的所有组合以生成这个初始词的子词。先只删除 1 个字母,然后再删除 n 个字母以构建至少 2 个字母的单词。
所以从我们的例子来看,它的意思是制作像 KOO、BOO、OO、BK、BO 这样的词。
顺便说一句,我目前的算法说可以从 BKOO 中生成 7 种组合。 (我也包括首字母)。
Array
(
[0] => BKOO
[1] => Array
(
[0] => BKOO
[1] => KOO
[2] => OO
[3] => KO
[4] => BOO
[5] => BO
[6] => BKO
[7] => BK
)
)
注意没有像 BOK 或 OOK 这样的词,因为这意味着重新排序,但我不想这样做。我只想从当前单词中删除字母,不要重新排序。
现在的问题是,这对于 15 的长度来说非常慢。它需要永远。如何加快速度?
function comb($s, $r = [], $init = false) {
if ($init) {
$s = mb_strtoupper($s);
$r[] = $s;
}
$l = strlen($s);
if (!$s || $l < 3) return [];
for ($i=0; $i<$l; $i++) {
$t = rem_index($s, $i);
$r[] = $t;
$r = array_merge($r, comb($t));
}
$ret = array_unique((array)$r);
return $init ? array_values($ret) : $ret;
}
// remove character at position
function rem_index($str, $ind)
{
return substr($str,0,$ind++). substr($str,$ind);
}
$s = 'BKOO';
print_r(comb($s, [], true));
https://www.tehplayground.com/62pjCAs70j7qpLJj
书呆子部分:??
有趣的笔记 - 首先我想我会生成一些删除索引的数组,例如,首先只删除 1 个字母,所以说删除 0 然后删除 1 等,然后是 2 组合,所以删除 1 和 2、1 和 3 等,但是然后我认为一次从字符串中删除 N 个字母会很困难,所以我想到我总是从字符串中删除一些字母,如果你得到我,再递归调用该函数,所以下一级是一个字符已经删除并再次进行删除迭代。问题是由于某种原因它很慢。
顺便说一句,如果您也有数学背景,那么计算结果组合的方程式是什么?对我来说,粗略的计算是让 15 个字母的单词 14 * 13 * 12 或至少它进行这样的迭代,但这将是数百万个组合,显然即使对于像 8 这样的较短单词也不是这样。
谢谢。
答案 0 :(得分:1)
您可以迭代字符串来获取它。
function foo(&$res,$str,$min_length){
if(strlen($str) <= $min_length){
return;
}
$remains=[];
for($i=0; $i<strlen($str); $i++){
$remain = substr($str,0,$i) . substr($str,$i+1);
if(!isset($res[$remain])) { // only process unprocessed sub string
$res[$remain] = $remain;
$remains[] = $remain;
}
}
foreach($remains as $remain){
if(strlen($remain) == $min_length){
$res[$remain] = $remain;
}else {
foo($res, $remain, $min_length);
}
}
return;
}
$str = "BKOO";
$res = [];
foo($res,$str,2);
var_dump(array_values($res));