TGViewer
PHP | LeetCode PHP | LeetCode @easy_php_task · 1.33K subscribers
Post #882 146
Задача: 282. Expression Add Operators
Сложность: hard

Дана строка num, содержащая только цифры, и целое число target. Верните все возможные варианты вставки бинарных операторов '+', '-', и/или '*' между цифрами строки num так, чтобы результирующее выражение вычислялось в значение target.
Учтите, что операнды в возвращаемых выражениях не должны содержать ведущих нулей.

Пример:
Input: num = "232", target = 8
Output: ["2*3+2","2+3*2"]
Explanation: Both "2*3+2" and "2+3*2" evaluate to 8.


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

1⃣Инициализация и рекурсивный вызов:
Создайте класс Solution с полями для хранения результирующих выражений, строки цифр и целевого значения.
Инициализируйте эти поля в методе addOperators и запустите рекурсивный метод для генерации всех возможных выражений.

2⃣Рекурсивная генерация выражений:
В методе recurse на каждом шаге рассматривайте текущий индекс, предыдущий операнд, текущий операнд и текущее значение выражения.
Обрабатывайте все возможные операторы: без оператора (расширение текущего операнда), сложение, вычитание и умножение. На каждом шаге обновляйте текущее значение и выражение.

3⃣Проверка и запись валидных выражений:
Когда вся строка цифр обработана, проверяйте, соответствует ли итоговое значение целевому значению и нет ли остатков операндов.
Если выражение валидное, записывайте его в список результатов.

😎 Решение:
class Solution {
private $answer;
private $digits;
private $target;

private function recurse($index, $previousOperand, $currentOperand, $value, &$ops) {
if ($index == strlen($this->digits)) {
if ($value == $this->target && $currentOperand == 0) {
$this->answer[] = implode("", $ops);
}
return;
}

$currentOperand = $currentOperand * 10 + intval($this->digits[$index]);
$currentValRep = strval($currentOperand);

if ($currentOperand > 0) {
$this->recurse($index + 1, $previousOperand, $currentOperand, $value, $ops);
}

$ops[] = "+";
$ops[] = $currentValRep;
$this->recurse($index + 1, $currentOperand, 0, $value + $currentOperand, $ops);
array_pop($ops);
array_pop($ops);

if (count($ops) > 0) {
$ops[] = "-";
$ops[] = $currentValRep;
$this->recurse($index + 1, -$currentOperand, 0, $value - $currentOperand, $ops);
array_pop($ops);
array_pop($ops);

$ops[] = "*";
$ops[] = $currentValRep;
$this->recurse($index + 1, $currentOperand * $previousOperand, 0, $value - $previousOperand + ($currentOperand * $previousOperand), $ops);
array_pop($ops);
array_pop($ops);
}
}

public function addOperators($num, $target) {
if (strlen($num) == 0) {
return [];
}

$this->target = $target;
$this->digits = $num;
$this->answer = [];
$ops = [];
$this->recurse(0, 0, 0, 0, $ops);
return $this->answer;
}
}


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_php_task
  1. Oct 16, 2026Задача: 760. Find Anagram Mappings Сложность: easy Вам даны два целочисленных массива nums…
  2. Oct 15, 2026Задача: 474. Ones and Zeroes Сложность: medium Дан массив двоичных строк strs и два целых…
  3. Oct 15, 2026Задача: 1273. Delete Tree Nodes Сложность: medium Дерево, укорененное в узле 0, задано сле…
  4. Oct 14, 2026Задача: 724. Find Pivot Index Сложность: easy Если задан массив целых чисел nums, вычислит…
  5. Oct 14, 2026Задача: 674. Longest Continuous Increasing Subsequence Сложность: easy Дан неотсортированн…
  6. Oct 13, 2026Задача: 899. Orderly Queue Сложность: hard Вам дана строка s и целое число k. Вы можете вы…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →