我有以下结构:
A 3
B 2
C 2
D 1
E 0
虽然字母代表元素的实际值,但数字代表元素的级别。我希望能够输出以下内容:
A B D E
A C D E
我现在的代码没有正确完成工作,我需要找到一种解决问题的递归方法。任何帮助都会非常感激。
<?php
// An array that holds the values
$values = array();
$values[] = "A";
$values[] = "B";
$values[] = "C";
$values[] = "D";
$values[] = "E";
// An array that holds the levels
$levels = array();
$levels[] = 3;
$levels[] = 2;
$levels[] = 2;
$levels[] = 1;
$levels[] = 0;
// We are asuming that 3 is the heighest level
$startingLevel = 3;
// this array will holds all combinations. each group is seperated by a |
$results = array();
for($i = 0; $i < count($values); $i++)
{
$thisValue = $values[$i];
$thisLevel = $levels[$i];
if($thisLevel == $startingLevel)
{
$results[] = $thisValue;
$j = 0;
$k = $i;
$limit = $thisLevel;
while($j < $thisLevel)
{
if($levels[$k] < $limit)
{
$results[] = $values[$k];
$limit = $levels[$k];
$j++;
}
$k++;
}
// separating groups by |
$results[] = "|";
}
}
// Show results
print_r($results);
?>
答案 0 :(得分:1)
你最想要的是用O((n ^ 2-n)/ 2)生成所有组合,然后将它与第二个数组进行比较,你想要的是在Javascript中查看我的例子。 Array Waypoints保存您的第一个Array。 Array wayStr拥有您的解决方案。然后,您只需要遍历解决方案并将其与第二个阵列进行比较。
function getWayStr(curr) {
var nextAbove = -1;
for (var i = curr + 1; i < waypoints.length; ++i) {
if (nextAbove == -1) {
nextAbove = i;
} else {
wayStr.push(waypoints[i]);
wayStr.push(waypoints[curr]);
}
}
if (nextAbove != -1) {
wayStr.push(waypoints[nextAbove]);
getWayStr(nextAbove);
wayStr.push(waypoints[curr]);
}
}
答案 1 :(得分:0)
分隔不同级别并使用排列:
lexicographic ordering