您的位置:首页 > Web前端

【LeetCode】241. Different Ways to Add Parentheses

2017-05-18 16:44 375 查看

【LeetCode】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]

【解题思路】

  动态规划(DP):

  1.  预处理,num存储数字,sign存储运算符
  2.  ans[i][j]存储第i个数字到第j个数字的所有运算结果
  3.  对所有n∈[i, j],计算del = ans[i]
[k] +/-/*(根据sign
得到) ans[n+1][j][k], 将del压入ans[i][j]中
  4.  返回ans[0][len-1]

【代码】

class Solution {
public:
vector<int> diffWaysToCompute(string input) {
vector<int> num, sign;
int i, j, n, k = 0, len, u, v;
for(i = 0;i < input.length();i++) {
if(input[i] >= '0' && input[i] <= '9') k = k * 10 + (int)input[i] - 48;
else {
num.push_back(k);
k = 0;
switch (input[i]) {
case '+' : sign.push_back(1);break;
case '-' : sign.push_back(2);break;
case '*' : sign.push_back(3);break;
}
}
}
num.push_back(k);
len = num.size();
vector<vector<vector<int>>> ans(len, vector<vector<int>>(len, vector<int>()));
for(i = 0;i < len;i++) ans[i][i].push_back(num[i]);
for(k = 1;k < len;k++) {
for(j = 0;j + k < len;j++) {
for(n = 0;n < k;n++) {
for(u = 0;u < ans[j][j+n].size();u++) {
for(v = 0;v < ans[j+n+1][j+k].size();v++) {
int del = (sign[j+n] == 1) ? ans[j][j+n][u]+ans[j+n+1][j+k][v] : ((sign[j+n] == 2) ? ans[j][j+n][u]-ans[j+n+1][j+k][v] : ans[j][j+n][u]*ans[j+n+1][j+k][v]);
ans[j][j+k].push_back(del);
}
}
}
}
}
return ans[0][len-1];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode