leetcode_c++:Divide and Conquer: Expression Add Operators(282)

原创 2016年08月28日 15:42:24

Given a string that contains only digits 0-9 and a target value, return all possibilities to add binary operators (not unary) +, -, or * between the digits so they evaluate to the target value.

123", 6 -> ["1+2+3", "1*2*3"] 
"232", 8 -> ["2*3+2", "2+3*2"]
"105", 5 -> ["1*0+5","10-5"]
"00", 0 -> ["0+0", "0-0", "0*0"]
"3456237490", 9191 -> []

class Solution {
public:
    vector<string> addOperators(string num, int target) {
        vector<string> result;
        if (num.size() == 0) return result;
        helper(num, target, result, "", 0, 0, 0, ' ');
        return result;        
    }

    //DFS algorithm
    void helper(const string &num, const int target, //`num` and `target` never change
                vector<string>& result, // the array store all of the answers
                string solution, //the current potential answer.
                int idx, // the current index of `num` array
                long long val, // the current value we calculated so far
                long long prev, // the lastest value we used for calculation, which used for operation prioirty adjustment
                char preop ) // the latest "+" or "-" operation, which used for operation prioirty adjustment 
    {

        if (target == val && idx == num.size()){
            result.push_back(solution);
            return;
        }
        if (idx == num.size()) return;

        string n;
        long long v=0;
        for(int i=idx; i<num.size(); i++) {
            //get rid of the number which start by "0"
            //e.g.  "05" is not the case.
            if (n=="0") return;

            n = n + num[i];
            v = v*10 + num[i]-'0';

            if (solution.size()==0){ 
                // the first time for initialization
                helper(num, target, result, n, i+1, v, 0, ' ');
            }else{
                // '+' or '-' needn't to adjust the priority
                helper(num, target, result, solution + '+' + n, i+1, val+v, v, '+');
                helper(num, target, result, solution + '-' + n, i+1, val-v, v, '-');

                //if we meet multiply operation, we need adjust the calcualtion priority
                // e.g. if the previous value is calculated by 2+3=5, 
                //      then if we need to multipy 4, it is not 5*4, it is 2+3*4=2+12=24
                //      we need be careful about multiply again, such as: 2+3*4*5
                if (preop=='+') {
                    helper(num, target, result, solution + '*' + n, i+1, (val-prev)+prev*v, prev*v, preop);
                }else if (preop=='-'){
                    helper(num, target, result, solution + '*' + n, i+1, (val+prev)-prev*v, prev*v, preop);
                }else {
                    helper(num, target, result, solution + '*' + n, i+1, val*v, v, '*');
                }
            }
        }

    }
};
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[LeetCode]282. Expression Add Operators

282. Expression Add Operators Given a string that contains only digits 0-9 and a target value, ret...
  • Johnkui
  • Johnkui
  • 2016年04月13日 01:29
  • 413

Leetcode 282. Expression Add Operators

282. Expression Add Operators Total Accepted: 17890 Total Submissions: 65879 Difficulty: Hard ...

LeetCode 282. Expression Add Operators(表达式)

原题网址:https://leetcode.com/problems/expression-add-operators/ Given a string that contains only ...
  • jmspan
  • jmspan
  • 2016年04月14日 09:11
  • 653

Leetcode 282. Expression Add Operators[hard]

题目: Given a string that contains only digits 0-9 and a target value, return all possibilities to ad...

LeetCode-282. Expression Add Operators (JAVA)表达式求值

LeetCode-282. Expression Add Operators (JAVA)表达式求值

282. Expression Add Operators

解题思路:深搜 遍历所有可能的情况,终止条件为表达式计算的结果等于target。注意,这里要使用long 类型保存整数,否则会溢出。我在vs2013,win32模式下使用long同样不能通过 "3...

Divide and Conquer (1) -- Kth Largest Element in an Array,Different Ways to Add Parentheses

Kth Largest Element in an Array,Different Ways to Add Parentheses
  • dwt0317
  • dwt0317
  • 2017年01月12日 22:59
  • 97

Leetcode divide & conquer || Different Ways to Add Parentheses

本题来源于Leetcode Divide and Conquer题库,难度Medium

[Divide and Conquer]241. Different Ways to Add Parentheses

题目: 题目分析: 1、根据题目要求,函数的输入为一个只涉及"+"、"-"、"×"三种运算的字符串。需要根据输入计算出所有可能计算顺序所对应的结果,并返回包含所有答案的Vector(升序)。 2、问...

Expression Add Operators -- leetcode

算法一, 每得到一个新的整数,对其进行+, -, *三种运算。 使用dfs递归,免去重复计算。 此处使用sum, mul两个变量记录中间结果。 sum 存储累加和, mul 存储乘积结果。 之所以用两...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode_c++:Divide and Conquer: Expression Add Operators(282)
举报原因:
原因补充:

(最多只允许输入30个字)