Total Accepted: 23674 Total
Submissions: 65569 Difficulty: Medium
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 *
.
Example 1
Input: "2-1-1"
.
((2-1)-1) = 0 (2-(1-1)) = 2
Output: [0, 2]
Example 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
Hide Tags
Hide Similar Problems
(M) Unique Binary Search Trees II (H)
Basic Calculator (H) Expression Add Operators
分析:
本题不会,代码纯属借鉴和学习!
这是一个要考虑各种组合情况的问题,关键还是怎么入手得到各种组合情况!
从别人的代码来看,一旦遇到运算符号(不是运算符号暂时不处理),就分治法考虑各种组合情况:
然后将运算结果重新根据当前运算符进行运算。
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