123456789101112131415161718192021222324252627282930313233343536 |
- func addOperators(num string, target int) (res []string) {
- strlen := len(num)
- exp := make([]byte, 2*strlen)
- DFS(num, strlen, target, 0, &exp, 0, 0, 0, &res) // O(n^4) time, O(n) space
- return
- }
- func DFS(num string, strlen, target, pos int, exp *[]byte, length, prev, curr int, res *[]string) {
- if pos == strlen && curr == target {
- *res = append(*res, string((*exp)[0:length]))
- return
- }
- n, i, l := 0, pos, length
- if pos != 0 {
- length++
- }
- for i < strlen {
- if num[pos] == '0' && pos < i { // Avoid leading zero
- break
- }
- n = n*10 + int(num[i]-'0')
- (*exp)[length] = num[i]
- length, i = length+1, i+1
- if pos == 0 { // Init DFS
- DFS(num, strlen, target, i, exp, length, n, n, res)
- continue
- }
- (*exp)[l] = '+'
- DFS(num, strlen, target, i, exp, length, n, curr+n, res)
- (*exp)[l] = '-'
- DFS(num, strlen, target, i, exp, length, -n, curr-n, res)
- (*exp)[l] = '*'
- DFS(num, strlen, target, i, exp, length, prev*n, curr-prev+prev*n, res)
- }
- }
|