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

来源:互联网 发布:淘宝的增高精油有用吗 编辑:程序博客网 时间:2024/05/16 06:57

题目链接: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