###### tags: `Leetcode` `medium` `divide and conquer` `python` `c++`
# 241. Different Ways to Add Parentheses
## [題目連結:] https://leetcode.com/problems/different-ways-to-add-parentheses/description/
## 題目:
Given a string ```expression``` of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. You may return the answer in **any order**.
The test cases are generated such that the output values fit in a 32-bit integer and the number of different results does not exceed 10**4.
**Example 1:**
```
Input: expression = "2-1-1"
Output: [0,2]
Explanation:
((2-1)-1) = 0
(2-(1-1)) = 2
```
**Example 2:**
```
Input: expression = "2*3-4*5"
Output: [-34,-14,-10,-10,10]
Explanation:
(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
```
## 解題想法:
* 題目為給一表達式,可能含有加減乘,可再任意位置添加括號,求出所有可能表達式的值
* Divide and Conquer:
* **核心概念** :
* 若當前字符為 **運算符**
* 切割字串為左右字串,分別進行遞迴
* Step1:
* 建立結果res數組,遍歷expression中所有字符
* Step2:
* 當前字符為運算符,將expression分成左右兩段遞迴
* Step3:
* 由Step2,得到左右遞迴結果: left,right,兩串數組
* 分別從left,right中的數字,經由當前運算符進行運算,並存於res
* Step4:
* 若遍歷完expression後,res仍為空,表示expression為數字,直接轉換成整數存入res即可
* Step5:
* return res
## Python:
``` python=
class Solution(object):
def diffWaysToCompute(self, expression):
"""
:type expression: str
:rtype: List[int]
"""
res=list() #創新一個list
n = len(expression)
for i in range(n):
if expression[i]=='+' or expression[i]=='-' or expression[i]=='*':
#以當前i為中心
left = self.diffWaysToCompute(expression[:i]) #左半段 不包含i
right = self.diffWaysToCompute(expression[i+1:]) #右半段 不包含i
for l in left:
for r in right:
if expression[i]=='+':
res.append(l+r)
elif expression[i]=='-':
res.append(l-r)
elif expression[i]=='*':
res.append(l*r)
if not res: #純數字
res.append(int(expression))
return res
expression = "2*3-4*5"
result = Solution()
ans=result.diffWaysToCompute(expression)
print(ans)
```
## C++:
* string to int: **stoi**
``` cpp=
class Solution {
public:
vector<int> diffWaysToCompute(string expression) {
vector<int> res;
int n=expression.size();
for (int i=0; i<n; i++){
if (expression[i]=='+' || expression[i]=='-' || expression[i]=='*'){
vector<int> left=diffWaysToCompute(expression.substr(0,i));// substr(pos,len)
vector<int> right=diffWaysToCompute(expression.substr(i+1)); //(pos~end)
for (int valL: left){
for (int valR: right){
if (expression[i]=='+')
res.push_back(valL+valR);
else if (expression[i]=='-')
res.push_back(valL-valR);
else
res.push_back(valL*valR);
}
}
}
}
if (res.empty())
res.push_back(stoi(expression)); //String TO Int
return res;
}
};
```