[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;};
- [leetcode] 282. Expression Add Operators 解题报告
- [Leetcode] 282. Expression Add Operators 解题报告
- [leetcode] 282. Expression Add Operators
- [LeetCode]282. Expression Add Operators
- Leetcode 282. Expression Add Operators
- LeetCode 282. Expression Add Operators
- LeetCode 282. Expression Add Operators
- 【Leetcode】282. Expression Add Operators
- Leetcode 282. Expression Add Operators
- Leetcode 282. Expression Add Operators
- [leetcode]282. Expression Add Operators
- leetcode 282. Expression Add Operators
- LeetCode:Expression Add Operators
- 【LeetCode】Expression Add Operators
- Expression Add Operators -- leetcode
- Leetcode -- Expression Add Operators
- LeetCode -- Expression Add Operators
- LeetCode Expression Add Operators
- 设计模式之策略模式Stragegy Pattern
- Geekband011第十一周笔记分享
- 使用activemq 和 quartz构建简易版企业调度中心
- LeetCode 340. Longest Substring with At Most K Distinct Characters
- android:clipToPadding和android:clipChildren的使用
- [leetcode] 282. Expression Add Operators 解题报告
- getline()这个函数
- 在MaterialDesign中--实现文字缩放并入Toolbar的一种方法
- Toolbar + DrawerLayout实现侧滑
- Tree Traverse
- Pause/Resume Instance 操作详解 - 每天5分钟玩转 OpenStack(34)
- 阿里dubbo框架使用系列:如何在分布式环境中调试接口
- 易經大意 041_060
- C++设计模式浅识策略模式