LeetCode OJ : 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]

这里的主要思想是讲左右的子串分别算出来之后,再做全排列就行了,可能有很所重复计算所以说效率比较低

 1 class Solution {
 2 public:
 3     vector<int> diffWaysToCompute(string input) {
 4         vector<int> result;
 5         int length = input.length();
 6         for(int i = 0; i < length; ++i){
 7             char c = input[i];
 8             if(c == '+' || c == '-' || c == '*'){
 9                 string inputLeft = input.substr(0, i);
10                 string inputRight = input.substr(i+1);
11                 vector<int>leftResult = diffWaysToCompute(inputLeft);
12                 vector<int>rightResult = diffWaysToCompute(inputRight);
13                 for(int j = 0; j < leftResult.size(); ++j){
14                     for(int k = 0; k < rightResult.size(); ++k){
15                         if(c == '+')
16                             result.push_back(leftResult[j] + rightResult[k]);
17                         else if(c == '-')
18                             result.push_back(leftResult[j] - rightResult[k]);
19                         else if(c == '*')
20                             result.push_back(leftResult[j] * rightResult[k]);
21                     }
22                 }
23             }       
24         }
25         if(result.empty())//这一步主要的作用是讲分治得到的最后的字符转换成数字
26             result.push_back(stoi(input));
27         return result;
28     }
29 };

 java版本如下所示:

 1 public class Solution {
 2     public List<Integer> diffWaysToCompute(String input) {
 3         ArrayList<Integer> ret = new ArrayList<Integer>();
 4         for(int i = 0; i < input.length(); ++i){
 5             char c = input.charAt(i);
 6             if(c == '+' || c == '-' || c == '*'){
 7                 List<Integer> leftRet = diffWaysToCompute(input.substring(0, i));
 8                 List<Integer> rightRet = diffWaysToCompute(input.substring(i+1, input.length()));
 9                 for(int left : leftRet){
10                     for(int right : rightRet){
11                         if(c == '+'){
12                             ret.add(left + right);
13                         }else if(c == '-'){
14                             ret.add(left - right);
15                         }else{
16                             ret.add(left * right);
17                         }
18                     }
19                 }
20             }
21         }
22         if(ret.isEmpty()){
23             ret.add(Integer.parseInt(input));
24         }
25         return ret;
26     }
27 }
原文地址:https://www.cnblogs.com/-wang-cheng/p/4853883.html