标签:
Given a string of numbers and operators, return all possible results from
computing all the different possible ways to group numbers and operators.
The valid operators are+
, -
and *
.
Input: "2-1-1"
.
((2-1)-1) = 0 (2-(1-1)) = 2
Output: [0, 2]
Input: "2*3-4*5"
(2*(3-(4*5))) = -34 ((2*3)-(4*5)) = -14 ((2*(3-4))*5) = -10 (2*((3-4)*5)) = -10 (((2*3)-4)*5) = 10
Output: [-34, -14, -10, -10, 10]
Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
分析:
本题不会,代码纯属借鉴和学习!
这是一个要考虑各种组合情况的问题,关键还是怎么入手得到各种组合情况!
从别人的代码来看,一旦遇到运算符号(不是运算符号暂时不处理),就分治法考虑各种组合情况:
然后将运算结果重新根据当前运算符进行运算。
class Solution { public: vector<int> diffWaysToCompute(string input) { vector<int> result; int size = input.size(); for (int i = 0; i < size; i++) { char cur = input[i]; if (cur == '+' || cur == '-' || cur == '*') {//如果是运算符号 // 分治法,分两边解决,解决获取结果之后重新根据当前符号进行运算 vector<int> result1 = diffWaysToCompute(input.substr(0, i));//从0位置开始获取长度为i的字符串 vector<int> result2 = diffWaysToCompute(input.substr(i+1));//从0位置开始获取后面所有字符 for (auto n1 : result1) { for (auto n2 : result2) { if (cur == '+') result.push_back(n1 + n2); else if (cur == '-') result.push_back(n1 - n2); else result.push_back(n1 * n2); } } } } // 如果输入字符串只是数字(字符数字) if (result.empty()) result.push_back(atoi(input.c_str())); return result; } };
完整代码:
#include<iostream> #include<vector> using namespace std; vector<int> diffWaysToCompute(string input) { vector<int> result; int len=input.size(); for(int k=0;k<len;k++) { if(input[k]=='+'||input[k]=='-'||input[k]=='*') { vector<int> result1=diffWaysToCompute(input.substr(0,k)); vector<int> result2=diffWaysToCompute(input.substr(k+1)); for(vector<int>::iterator i=result1.begin();i!=result1.end();i++) for(vector<int>::iterator j=result2.begin();j!=result2.end();j++) { if(input[k]=='+') result.push_back((*i)+(*j)); else if(input[k]=='-') result.push_back((*i)-(*j)); else result.push_back((*i)*(*j)); } } } if(result.empty()) result.push_back(atoi(input.c_str())); return result; } int main() { string input="2*3-4*5"; vector<int> vec; vec=diffWaysToCompute(input); for(int i=0;i<vec.size();i++) cout<<vec[i]<<' '; cout<<endl; system("pause"); }
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/51581228
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895
<LeetCode OJ> 241. Different Ways to Add Parentheses
标签:
原文地址:http://blog.csdn.net/ebowtang/article/details/51581228