首页 > 解决方案 > 从单词数组中查找唯一排列,将一组单词限制为 12 个字符

问题描述

让我解释一下,我需要这个来开发一个基于一组预先定义的单词的独特的标题生成器。

例如,我有这个单词列表:

$list = ['苹果','香蕉','梨'];

我的标题大小有限,例如:1 个字符如果我生成所有排列的列表,我将拥有:

apple
banana
pear
apple banana
apple pear
apple banana pear
banana apple
banana pear
banana apple pear
pear apple
pear banana
pear banana apple

但我不想要这个,任何规则是:单词不能在另一组单词中再次重复,我只想要最大的一组单词 <= 12 个字符

结果将是:

apple banana
apple pear
banana pear

我已经尝试了以下解决方案,但这些都没有帮助:

PHP算法从单个集合中生成特定大小的所有组合

PHP查找数组的所有(有点)唯一组合

集合/数组中的每个(特定大小)组合,没有重复项

高效的 PHP 算法生成输入的所有组合/排列

给定字符生成器和长度,如何生成所有可能字符串的列表?

我有这段代码,但它没有按照我的意愿删除重复项

public static function search_get_combos($array = array(), $maxCaracters=12) {

        sort($array);

        $terms = array();

        for ($dec = 1; $dec < pow(2, count($array)); $dec++) {
            $curterm = array();
            foreach (str_split(strrev(decbin($dec))) as $i => $bit) {
                if ($bit) {
                    $curterm[] = $array[$i];
                }
            }
            if (!in_array($curterm, $terms) && count($curterm) > 1) {
                $title = implode(' ', $curterm);
                if (strlen($title) <= $maxCaracters){
                    $terms[$title] = $curterm;
                }
            }
        }

        return $terms;

    }

输出:

array(6) {
  ["Apple"]=>
  array(1) {
    [0]=>
    string(5) "Apple"
  }
  ["Banana"]=>
  array(1) {
    [0]=>
    string(6) "Banana"
  }
  ["Apple Banana"]=>
  array(2) {
    [0]=>
    string(5) "Apple"
    [1]=>
    string(6) "Banana"
  }
  ["Pear"]=>
  array(1) {
    [0]=>
    string(4) "Pear"
  }
  ["Apple Pear"]=>
  array(2) {
    [0]=>
    string(5) "Apple"
    [1]=>
    string(4) "Pear"
  }
  ["Banana Pear"]=>
  array(2) {
    [0]=>
    string(6) "Banana"
    [1]=>
    string(4) "Pear"
  }
}

标签: phppermutation

解决方案


你是这个意思吗?

<?php

$list = ['apple', 'banana', 'pear', 'a'];

$result = [];

foreach($list as $k => $v) {
    unset($list[$k]);
    foreach($list as $subv) {
        $word_combination = $v.' '.$subv;
        if (strlen($word_combination) >= 10) {
            array_push($result, $v.' '.$subv);
        }
    }
}

print_r($result);
print(implode(' ', $result));

输出:

Array
(
    [0] => apple banana
    [1] => apple pear
    [2] => banana pear
)
apple banana apple pear banana pear

我不明白

我只想要最大的一组词 <= 10 个字符

您的意思是apple banana必须超过 10 个字符(apple banana= 12 个字符)?如果是,我添加了检查。例如apple a(7 个字符)将被忽略。


推荐阅读