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)
	}
}