«Умнее» подход (с использованием динамического программирования) в основном это:
Для каждой подстроки исходной строки определите все возможные значения, которые она может создать. (например, в вашем первом примере «12» может принимать значение 1 + 2 = 3 или 1 * 2 = 2)
Может быть много разных комбинаций, но многие из них будут дубликатами. (Кроме того, вы должны игнорировать все комбинации, которые больше, чем цель).
Таким образом, когда вы добавляете «+» или «*», вы можете представить его как объединение двух подстрок строки. (и поскольку у вас есть возможные значения для каждой подстроки, вы можете увидеть, возможна ли такая комбинация)
Эти значения могут быть сгенерированы аналогично: попробуйте разбить подстроку всеми возможными способами и объединить различные значения в каждой половине подстроки.
Таким образом, общее число «состояний» примерно соответствует | S | ^ 2 * target - для вашего примера это на хуже , чем метод грубой силы. Но если бы у вас была строка длиной 1000 и целевое значение, скажем, 5000, то проблема была бы решена с помощью динамического программирования.