241. Different Ways to Add Parentheses

来源:互联网 发布:淘宝全球购资质查询 编辑:程序博客网 时间:2024/06/15 17:36

241. Different Ways to Add Parentheses


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]

题目大意

对input的string,添加括号改变运算顺序,计算出所有可能的值。
PS: 经过尝试后,输出顺序不会影响正确性。

解题思路

利用分治法,以符号位为分界点,将input截成左右两段,递归计算,并将结果push进列表result尾部。
PS: 如果input不含符号,则将其转换为int格式,push进列表result。

算法复杂度

遍历input寻找符号的复杂度:O(n)
计算每种可能顺序结果的复杂度:O(logn)
总复杂度:O(nlogn)

代码实现

class Solution {public:  vector<int> diffWaysToCompute(string input) {    vector<int> result;    int length= input.size();    for (int i = 0; i < length; i++) {      // 以+, -, * 为‘分’的标志      if (input[i] == '+' || input[i] == '-' || input[i] == '*') {        vector<int> left = diffWaysToCompute(input.substr(0, i));        vector<int> right = diffWaysToCompute(input.substr(i+1));        vector<int>::iterator j, k;        for (j = left.begin(); j != left.end(); j++) {          for (k = right.begin(); k != right.end(); k++) {            switch(input[i]) {              case '+':                result.push_back((*j)+(*k));                break;              case '-':                result.push_back((*j)-(*k));                break;              case '*':                result.push_back((*j)*(*k));            }          }        }      }    }    // input不含符号的情况    if (result.empty()) {      result.push_back(atoi(input.c_str()));    }    return result;  }};
原创粉丝点击