[leetcode][dfs] Different Ways to Add Parentheses

来源:互联网 发布:哪些网络装修公司好 编辑:程序博客网 时间:2024/05/22 11:48

题目:

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]

class Solution {public:bool isOptr(char ch){if (ch == '+' || ch == '-' || ch == '*') return true;return false;}int oneCalculate(int n1, int n2, char optr){int res = 0;switch (optr){case '+':res = n1 + n2; break;case '-':res = n1 - n2; break;case '*':res = n1 * n2; break;default:break;}return res;}void calculate(vector<int> nums, vector<char> optr, int start, vector<int> &res){if (optr.empty()){res.push_back(nums[0]);return;}for (int i = start; i < nums.size()-1;++i){//注意从start开始int oneC = oneCalculate(nums[i], nums[i + 1], optr[i]);//删除一个操作符vector<char> optrNew(optr);vector<char>::iterator iterOptr = optrNew.begin();optrNew.erase(iterOptr+i);//删除两个操作数并在该位置插入oneCvector<int> numsNew(nums);vector<int>::iterator iterNum = numsNew.begin();numsNew.erase(iterNum + i, iterNum + i + 2);iterNum = numsNew.begin()+i;numsNew.insert(iterNum, oneC);int start = i - 1 >0 ? i - 1 : 0;calculate(numsNew, optrNew, start, res);}}vector<int> diffWaysToCompute(string input){int n = input.size();vector<int> nums;vector<char> optr;int i = 0;while (i < n){if (isOptr(input[i])){optr.push_back(input[i]);++i;}else if (isdigit(input[i])){int tmp = 0;while (isdigit(input[i])){tmp = 10 * tmp + (input[i] - '0');++i;}nums.push_back(tmp);}else ++i;}vector<int> res;calculate(nums, optr, 0, res);return res;}int main(){string input;cin >> input;vector<int> res = diffWaysToCompute(input);for (int i = 0; i < res.size()-1; ++i){cout << res[i] << ' ';}if (res.size() > 0) cout << res[res.size() - 1] << endl;return 0;}};


0 0