• 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);
                }
            }
        }
    }
    
  • 相关阅读:
    n年的一次聚会
    maven用途、核心概念、用法、常用参数和命令、扩展
    iOS系统架构和Object-C基本数据类型(1)
    Object-C类、方法、构造函数(2)
    iOS 【资源篇】
    iOS播放视频
    蘑菇街 IM 项目 TeamTalk
    Extjs5.0 学习之路【结构篇】
    Hibernate基础(一)
    C# Winform中无焦点状态下获取键盘输入或者USB扫描枪数据
  • 原文地址:https://www.cnblogs.com/reboot329/p/11169829.html
Copyright © 2020-2023  润新知