leetcode 282. Expression Add Operators

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

Example 1:

Input: num = "123", target = 6
Output: ["1+2+3", "1*2*3"] 

Example 2:

Input: num = "232", target = 8
Output: ["2*3+2", "2+3*2"]

Example 3:

Input: num = "105", target = 5
Output: ["1*0+5","10-5"]

Example 4:

Input: num = "00", target = 0
Output: ["0+0", "0-0", "0*0"]

Example 5:

Input: num = "3456237490", target = 9191
Output: []

解题思路:

没错!时间复杂度就是O(4^n)

DFS

class Solution {
public:
    vector<string> addOperators(string num, int target) 
    {
        string exp ;
        DFS(num , target , exp , 0 , 0 , 0) ;
        return ans ;
    }
    
    void DFS(string& num , int target , const string& exp , int pos , long pre , long cur)
    {
        if(pos == num.size())
        {
            if(cur == target) ans.push_back(exp) ;
            return ;
        }
        
        
        for(int l = 1 ; l <= num.size() - pos ; ++l)
        {
            string s = num.substr(pos , l) ;
            if(l > 1 && s[0] == '0') break ;
            long n = stol(s) ;
            
            if(pos == 0) 
            {
                DFS(num , target , exp + s , l , n , n);
                continue ;
            }
            
            DFS(num , target , exp + '+' + s , pos + l , n , cur+ n) ;
            DFS(num , target , exp + '-' + s , pos + l , -n , cur - n) ;
            DFS(num , target , exp + '*' + s , pos + l , pre * n , cur - pre + pre * n) ;
        }
    }
    
private :
    
    vector<string> ans ;
};

这里有一个C++上的问题。

如果是:void DFS(string& num , int target ,  string& exp , int pos , long pre , long cur)

DFS(num , target , exp + '+' + s , pos + l , n , cur+ n) 这一行会报错;

如果是void DFS(string& num , int target , const string& exp , int pos , long pre , long cur) 就不会报错。

因为常量引用可以绑定一个临时对象,而非常量引用不可以。exp + '+' + s会隐式转换成一个临时的string对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值