PHP | LeetCode
1.48K subscribers
181 photos
1.12K links
Cайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp

Тесты t.iss.one/+pSDoLEZBQRZlNmFi
Вопросы собесов t.iss.one/+RJaDhjYaQDo2Njcy
Вакансии t.iss.one/+J-DKRUtjUgMxZGNi
Download Telegram
#medium
Задача: 756. Pyramid Transition Matrix

Вы складываете блоки так, чтобы получилась пирамида. Каждый блок имеет цвет, который представлен одной буквой. Каждый ряд блоков содержит на один блок меньше, чем ряд под ним, и располагается по центру сверху. Чтобы пирамида выглядела эстетично, допускаются только определенные треугольные узоры. Треугольный узор состоит из одного блока, уложенного поверх двух блоков. Шаблоны задаются в виде списка допустимых трехбуквенных строк, где первые два символа шаблона представляют левый и правый нижние блоки соответственно, а третий символ - верхний блок. Например, "ABC" представляет треугольный шаблон с блоком 'C', уложенным поверх блоков 'A' (слева) и 'B' (справа). Обратите внимание, что это отличается от "BAC", где "B" находится слева внизу, а "A" - справа внизу. Вы начинаете с нижнего ряда блоков bottom, заданного в виде одной строки, который вы должны использовать в качестве основания пирамиды. Учитывая bottom и allowed, верните true, если вы можете построить пирамиду до самой вершины так, чтобы каждый треугольный узор в пирамиде был в allowed, или false в противном случае.

Пример:
Input: bottom = "BCD", allowed = ["BCC","CDE","CEA","FFF"]
Output: true


👨‍💻 Алгоритм:

1⃣Создайте структуру данных для хранения допустимых треугольных узоров.

2⃣Напишите рекурсивную функцию, которая проверяет возможность построения следующего уровня пирамиды.

3⃣Начните с нижнего уровня пирамиды и используйте рекурсию для построения каждого следующего уровня, проверяя каждый треугольный узор на допустимость.

😎 Решение:
function pyramidTransition($bottom, $allowed) {
$allowedDict = [];

foreach ($allowed as $pattern) {
$key = substr($pattern, 0, 2);
$value = $pattern[2];
if (!isset($allowedDict[$key])) {
$allowedDict[$key] = [];
}
$allowedDict[$key][] = $value;
}

return canBuild($bottom, $allowedDict);
}

function canBuild($currentLevel, $allowedDict) {
if (strlen($currentLevel) == 1) return true;

$nextLevelOptions = [];
for ($i = 0; $i < strlen($currentLevel) - 1; $i++) {
$key = substr($currentLevel, $i, 2);
if (!isset($allowedDict[$key])) return false;
$nextLevelOptions[] = $allowedDict[$key];
}

return canBuildNextLevel($nextLevelOptions, 0, "", $allowedDict);
}

function canBuildNextLevel($options, $index, $nextLevel, $allowedDict) {
if ($index == count($options)) return canBuild($nextLevel, $allowedDict);
foreach ($options[$index] as $option) {
if (canBuildNextLevel($options, $index + 1, $nextLevel . $option, $allowedDict)) return true;
}
return false;
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM