282. Expression Add Operators


July-10-2019

高级DFS+剪枝
难的地方在于如何处理乘法,比较巧妙的办法是把这一层运算的值也传下去。
1 + 2 * 3 ,把2的数量传入下面,如果是*这种高级运算,就先reset上一层的结果,先-刚才加上的2,再算3,传下去的是2 * 3这样。
然后,可以数不是非要1位= =这样如果多余1位,0不能作为最高位。
对我来说最难的是计算Time Complexity
O(4^n)

T(n) = 3 * T(n-1) + 3 * T(n-2) + 3 * T(n-3) + ... + 3 *T(1);
T(n-1) = 3 * T(n-2) + 3 * T(n-3) + ... 3 * T(1);
Thus T(n) = 4T(n-1);
class Solution {
    public List<String> addOperators(String num, int target) {
        List<String> res = new ArrayList<>();
        if (num == null || num.length() == 0) return res;
        
        dfs(res, new StringBuilder(), num, 0, (long)target, 0);
        
        return res;
    }
    
    public void dfs(List<String> res, StringBuilder sb, String s, int pos, long remain, long prev) {
        if (pos == s.length() && remain == 0) {
            
            res.add(sb.toString());
        } else if (pos == s.length()) {
            return ;
        } else {
            int len = sb.length();
            for (int i = pos; i < s.length(); i ++) {
                if (i != pos && s.charAt(pos) == '0') break;
                long tempVal = Long.valueOf(s.substring(pos, i + 1));
                if (pos == 0) {
                    dfs(res, sb.append(tempVal), s, i + 1, remain - tempVal, tempVal);
                } else {
                    dfs(res, sb.append('+').append(tempVal), s, i + 1, remain - tempVal, tempVal);
                    sb.setLength(len);
                    dfs(res, sb.append('-').append(tempVal), s, i + 1, remain + tempVal, -tempVal);
                    sb.setLength(len);
                    dfs(res, sb.append('*').append(tempVal), s, i + 1, remain + prev - (prev * tempVal), prev * tempVal);
                }
                sb.setLength(len);
            }
        }
    }
}
posted @ 2019-07-11 14:35  哇呀呀..生气啦~  阅读(153)  评论(0编辑  收藏  举报