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 :
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]
题意:
给一串表达式(由+、-、*以及数字组成),通过加括号改变运算顺序,求所有可能的结果。
思路:
没有想到什么比较巧妙的方法,只能递归所有的可能咯,其中有很多重复计算,等找到好办法了再来更新吧。
C++:
1 class Solution { 2 public: 3 4 //string转为int 5 int getInts(string str) 6 { 7 int ret = 0; 8 9 stringstream ss; 10 ss << str; 11 ss >> ret; 12 13 return ret; 14 } 15 16 vector<int> rec(vector<int>& num, int start, int ends) 17 { 18 vector<int> vec; 19 20 if(start == ends) 21 { 22 vec.push_back(num[start]); 23 return vec; 24 } 25 26 for(int i = start; i <= ends; i++) 27 { 28 if(num[i] < 0) 29 { 30 vector<int> vecl = rec(num, start, i - 1); 31 vector<int> vecr = rec(num, i + 1, ends); 32 33 vector<int>::iterator itl = vecl.begin(); 34 for(; itl != vecl.end(); itl++) 35 { 36 vector<int>::iterator itr = vecr.begin(); 37 for(; itr != vecr.end(); itr++) 38 { 39 if(num[i] == -3) 40 vec.push_back((*itl) + (*itr)); 41 else if(num[i] == -1) 42 vec.push_back((*itl) - (*itr)); 43 else if(num[i] == -4) 44 vec.push_back((*itl) * (*itr)); 45 } 46 } 47 } 48 } 49 return vec; 50 } 51 52 vector<int> diffWaysToCompute(string input) { 53 54 //先把字符串转换为一个int型的数组,符号用负数来表示 55 vector<int> nums; 56 int index = 0; 57 for(int i = 0; i < input.size(); i++) 58 { 59 if(input[i] == '+' || input[i] == '-' || input[i] == '*') 60 { 61 string str = input.substr(index, i - index); 62 nums.push_back(getInts(str)); 63 nums.push_back(input[i]-46); //加号转换为-3, 减号转换为-1,乘号为-4 64 index = i + 1; 65 } 66 if(i == input.size() - 1) 67 { 68 string str = input.substr(index, input.size() - index); 69 nums.push_back(getInts(str)); 70 } 71 } 72 73 int len = nums.size(); 74 if(len == 0 || len == 1) 75 return nums; 76 77 vector<int> ret = rec(nums, 0, len - 1); 78 return ret; 79 } 80 };