zoukankan      html  css  js  c++  java
  • 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);
                }
            }
        }
    }
    
  • 相关阅读:
    SQL后台分页三种方案和分析
    SQL分页查询语句
    SQL利用临时表实现动态列、动态添加列
    查询sybase DB中占用空间最多的前20张表
    敏捷软件开发之TDD(一)
    敏捷软件开发之开篇
    Sql Server 2012启动存储过程
    改变VS2013的菜单栏字母为小写
    Sql Server获得每个表的行数
    Sql Server trace flags
  • 原文地址:https://www.cnblogs.com/reboot329/p/11169829.html
Copyright © 2011-2022 走看看