【发布时间】:2019-09-24 09:05:18
【问题描述】:
给定 n = 3 条狗和 m = 3 对敌人,a = [1, 2, 3] 和 b = [3, 3, 1],狗 1 是狗 3 的敌人,狗 3 是狗 1 和 2 的敌人。因为 3 是 1 和 2 的敌人,所以它必须在自己的容器中。狗 1 和 2 可以在一起或分开。有 4 个可能的组:{1、2}、{1}、{2}、{3}。请注意,间隔沿着从 1 到 n 连续编号的原始狗线,即在这种情况下为 [1, 2, 3]。狗不能被重新排序,狗不能被跳过,例如。 {2, 1} 和 {1, 3} 无效。
所以给出以下内容:
案例#1:
n = 5
m = 2
a = (1,2)
b = (3,5)
结果是:一共可以组成11个组。
案例#2
n = 8
m = 4
a = (2,3,4,3)
b = (8,5,6,4)
结果是:一共可以组成18个组。
这是我的代码:
function countSubstrings($n, $a, $b) {
$tokenArr = array();
$x = 1;
while ($x <= $n){
$tokenArr[] = $x;
$x++;
}
$first = 0;
$last = $n - 1;
$outArr = array();
$pointer = 0;
/* generate groups left to right */
for ($i = $first; $i <= $last; $i++) {
$outArr[$pointer][] = $tokenArr[$i];
$tokenString = $tokenArr[$i];
$pointer++;
for ($j = $i + 1; $j <= $last; $j++) {
$tokenString .= $tokenArr[$j];
$outArr[$pointer] = str_split($tokenString);
$pointer++;
}
}
/* find the enemeies */
$intersects = array();
for($k = 0; $k < count($outArr); $k++){
if (count(array_intersect($outArr[$k], $a)) > 1 || count(array_intersect($outArr[$k], $b)) > 1) {
$intersects[] = $outArr[$k];
}
}
/* remove first and last items which are basically equal to $a and $b */
$intersects = array_slice($intersects, 1, -1);
/* remove the enemeies from generated groups */
foreach ($outArr as $keya => $valuea) {
if (in_array($valuea, $intersects)) {
unset($outArr[$keya]);
}
}
return count($outArr);
}
到目前为止,我的代码在以下情况下有效:#1 但在 #2 上失败。
【问题讨论】:
-
不错的尝试。相交逻辑对我来说似乎不正确,因为我们必须检查
[a , b]形成的关系,例如[1,2]是否存在于$outArr中。当前对count(array_intersect($outArr[$k], $a)) > 1的检查并不关心这一点。它而是检查$a中的任何元素是否存在于$outArr[$k]中。 -
这不是关于array_intersect,而是关于检查的方式。无论如何,我已经添加了一个答案。
-
我认为我们可以进一步优化这一点。完成后我会通知。