php生成缺失字母的字符串组合

时间:2021-06-24 09:18:59

标签: php algorithm

我想说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 这样的较短单词也不是这样。

谢谢。

1 个答案:

答案 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));