forked from soapyigu/LeetCode-Swift
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ExpressionAddOperators.swift
53 lines (44 loc) · 1.75 KB
/
ExpressionAddOperators.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
* Question Link: https://leetcode.com/problems/expression-add-operators/
* Primary idea: Classic Depth-first Search, terminates at when position encounters the
* length of the string num, add to result when eval is equal to target
*
* Note:
* 1. String cast to Integer will make character loss, e.g. "05" -> 5
* 2. Multiplication's priority is higher than addiction
*
* Time Complexity: O(n^n), Space Complexity: O(n)
*
*/
class ExpressionAddOperators {
func addOperators(_ num: String, _ target: Int) -> [String] {
var res = [String]()
dfs(Array(num), 0, target, 0, 0, &res, "")
return res
}
private func dfs(_ nums: [Character], _ index: Int, _ target: Int, _ eval: Int, _ mul: Int, _ res: inout [String], _ candidate: String) {
if index == nums.count {
if eval == target {
res.append(candidate)
}
return
}
for i in index..<nums.count {
// edge case: "305", 15 -> []
if i != index && nums[index] == "0" {
break
}
let curStr = String(nums[index...i])
guard let cur = Int(curStr) else {
fatalError("Invalid input: num")
}
if index == 0 {
dfs(nums, i + 1, target, cur, cur, &res, curStr)
} else {
dfs(nums, i + 1, target, eval + cur, cur, &res, candidate + "+" + curStr)
dfs(nums, i + 1, target, eval - cur, -cur, &res, candidate + "-" + curStr)
dfs(nums, i + 1, target, eval - mul + mul * cur, mul * cur, &res, candidate + "*" + curStr)
}
}
}
}