[leetcode] 282. Expression Add Operators 解题报告

62 篇文章 0 订阅
59 篇文章 0 订阅

题目链接:https://leetcode.com/problems/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 -> []


思路:今天看到我的有些文章被csdn收入算法和数据结构知识库,我真的很高兴也很惶恐.当初写解题报告只是为了让自己记住当初自己的想法,方便以后回顾,能够帮助别人我自己很高兴,又怕写的不好误导别人.算起来自去年十月份开始写解题报告,到现在leetcode总共331道题已经几乎刷完了,也写了300+的解题报告,我的刷题大业也已经持续了将近八个月之久,有时候想想除了当时考研,我再也没有投入这么多精力到一件事情上.在国外如此繁重的课程压力下我还是一直在坚持.中间找实习除了facebook几乎都没有回音,而facebook也在二面的时候跪了,当时非常沮丧,也认识到自己还差很多.但是生活还是要继续,所以我只能不停的刷题.而在这么长的时间里,我也感到我一直在进步,一方面是算法,另一方面是语言本身.我对c++的理解到现在也比一年前深了很多,马上要开始找全职了,希望我利用好这最后一个暑假拿到一个好的offer.


本题也是一个DFS+回溯的题目,在进行搜索的时候当前一位可以和后面的数字组成一个数,也可以直接从这里分割和后面的数字进行运算.在进行运算的时候需要二个数字,我们可以先保存路径,将当前运算符记录下来,等待下一个数字的时候的把运算符和下一个数字进行运算.即如果运算符为加号,我们只需要保存一个1,在和下一个数字运算只要乘1就行,然后将其值保存在结果中.同理对于减只要和下一个数字乘以-1.对于乘号我们需要保存一个用于乘的当前数字.

代码如下:

class Solution {
public:
    void DFS(string num, long sum, string path, int pos, long pre, int val)
    {//pre是未计算的前面累积下来的值,val是表示前面是什么运算,前面如果是加则为1,减-1,乘要累计乘积
        pre = pre*10 + num[pos]-'0';
        if(pre > INT_MAX) return;
        if(sum+pre*val ==0 && pos== num.size()-1) result.push_back(path+num[pos]);
        if(pos== num.size()-1) return;
        if(pre) DFS(num, sum, path+num[pos], pos+1, pre, val);//非0开头的数字可以保留下来
        DFS(num, sum+pre*val, path+num[pos]+'+', pos+1, 0, 1);
        DFS(num, sum+pre*val, path+num[pos]+'-', pos+1, 0, -1);
        DFS(num, sum, path+num[pos]+'*', pos+1, 0, val*pre);
    }

    vector<string> addOperators(string num, int target) {
        if(num.size() ==0) return {};
        DFS(num, -target, "", 0, 0, 1);
        return result;
    }
private:
    vector<string> result;
};

参考:https://leetcode.com/discuss/96257/shortest-c-solution


下面一个更好理解一些.

class Solution {
public:
    void DFS(string num, long sum, string path, int k, int pre)
    {
        if(k == num.size() && sum ==0) return ans.push_back(path);
        for(int i = k, val =0; i < num.size(); i++)
        {
            val = val*10 + (num[i]-'0');
            if(val > INT_MAX) break;
            if(k==0) DFS(num, sum+val, path+to_string(val), i+1, val);
            else
            {
                DFS(num, sum+val, path+"+"+to_string(val), i+1, val);
                DFS(num, sum-val, path+"-"+to_string(val), i+1, -val);
                DFS(num, sum-pre+pre*val, path+'*'+to_string(val), i+1, pre*val);
            }
            if(num[k]=='0') break;
        }
    }
    
    vector<string> addOperators(string num, int target) {
        if(num.size() ==0) return {};
        DFS(num, -target, "", 0, 0);
        return ans;
    }
private:
    vector<string> ans;
};





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值