leetcode:Expression Add Operators

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.

Examples: 

"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 -> []

Credits:
Special thanks to @davidtan1890 for adding this problem and creating all test cases.

Subscribe to see which companies asked this question


class Solution {
    
private:
    void addOperatorsDFS(string numStr, int target, long long diff, long long curNum, string curStr, vector<string> & retVtr) {
       
        // diff 是上一级运算时的增量,它自身包含正负号 
        if (numStr == "" && curNum == target){
            retVtr.push_back(curStr);
            return;
        }
        
        for (int i=1; i<=numStr.size(); i++)
        {
            string cur = numStr.substr(0,i);
            if (cur.size() > 1 && cur[0] == '0') 
                return;
            
            string next = numStr.substr(i);
            if (curStr.size() > 0) {
                // 注意 out + "+" + cur 这种写法可以避免使用vector的进栈和出栈
                addOperatorsDFS(next, target, stoll(cur), curNum + stoll(cur), curStr + "+" + cur, retVtr);
                addOperatorsDFS(next, target, -stoll(cur), curNum - stoll(cur), curStr + "-" + cur, retVtr);
                // 这里的操作是,先减去上一次的增量,然后+上一次的增量*这次的值
                // diff*stoll(cur)表示留给下一步计算的增量
                addOperatorsDFS(next, target, diff * stoll(cur), (curNum - diff) + diff * stoll(cur), curStr + "*" + cur, retVtr);
            } else {
                addOperatorsDFS(next, target, stoll(cur), stoll(cur), cur, retVtr);
            }
        }
    }
    
public:
    vector<string> addOperators(string num, int target) {
        
        vector<string> retVtr;
        
        addOperatorsDFS(num, target, 0, 0, "", retVtr);
        
        return retVtr;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值