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;
}
};