# 0282. Expression Add Operators ###### tags: `Leetcode` `Hard` `FaceBook` `Backtracking` Link: https://leetcode.com/problems/expression-add-operators/ ## 思路 $O(N×4^N)$ $O(N)$ backtracking 要注意的问题有: 1. 用long存数字而不是int,避免overflow 2. 数字不能有leading zero 3. 如何处理乘法: 遇到乘法就把上一个加上去的数字减掉然后加上乘法的result 时间复杂度:每个位置有四种可能,$+-*$或者和后面的数字组成一个数,对于每一种可能都要花$O(N)$的时间StringBuilder.toString() ## Code ```java= class Solution { public List<String> addOperators(String num, int target) { List<String> res = new ArrayList<>(); StringBuilder expr = new StringBuilder(); backtracking(res, expr, num, target, 0, 0, 0); return res; } private void backtracking(List<String> res, StringBuilder expr, String num, int target, long calcVal, long prevNum, int pos){ if(pos==num.length() && calcVal==target){ res.add(expr.toString()); return; } int len = expr.length(); for(int i = pos;i < num.length();i++){ //corner case: if char at start is 0, then the number can only be zero, without this if, we will get a number with leading zero. if(i!=pos && num.charAt(pos)=='0'){ break; } long curr = Long.parseLong(num.substring(pos, i+1)); if(pos==0){ backtracking(res, expr.append(curr), num, target, curr, curr, i+1); expr.setLength(len); } else{ backtracking(res, expr.append("+").append(curr), num, target, calcVal+curr, curr, i+1); expr.setLength(len); backtracking(res, expr.append("-").append(curr), num, target, calcVal-curr, -curr, i+1); expr.setLength(len); backtracking(res, expr.append("*").append(curr), num, target, calcVal-prevNum+prevNum*curr, prevNum*curr, i+1); expr.setLength(len); } } } } ```