241 - Different Ways to Add Parentheses
C++
class Solution { public: vector<int> diffWaysToCompute(string expression) { return dfs(expression); } vector<int> dfs(string exp) { if (memo.count(exp)) return memo[exp]; if (exp.size() < 3) return {stoi(exp)}; vector<int> ans; int n = exp.size(); for (int i = 0; i < n; ++i) { char c = exp[i]; if (c == '-' || c == '+' || c == '*') { vector<int> left = dfs(exp.substr(0, i)); vector<int> right = dfs(exp.substr(i + 1, n - i - 1)); for (int& a : left) { for (int& b : right) { if (c == '-') ans.push_back(a - b); else if (c == '+') ans.push_back(a + b); else ans.push_back(a * b); } } } } memo[exp] = ans; return ans; } private: unordered_map<string, vector<int>> memo; };
JAVA
import java.util.ArrayList; import java.util.List; public class Different_Ways_to_Add_Parentheses { public class Solution { public List<Integer> diffWaysToCompute(String input) { List<Integer> result = new ArrayList<>(); if (input == null || input.length() == 0) { return result; } for (int i = 0; i < input.length(); i++) { char c = input.charAt(i); if (!isOperator(c)) { continue; } List<Integer> left = diffWaysToCompute(input.substring(0, i)); List<Integer> right = diffWaysToCompute(input.substring(i + 1)); for (int num1 : left) { for (int num2 : right) { int val = calculate(num1, num2, c); result.add(val); } } } if (result.isEmpty()) { result.add(Integer.parseInt(input)); } return result; } private int calculate(int num1, int num2, char operator) { int result = 0; switch(operator) { case '+' : result = num1 + num2; break; case '-' : result = num1 - num2; break; case '*' : result = num1 * num2; break; } return result; } private boolean isOperator(char operator) { return (operator == '+') || (operator == '-') || (operator == '*'); } } } ############ class Solution { private static Map<String, List<Integer>> memo = new HashMap<>(); public List<Integer> diffWaysToCompute(String expression) { return dfs(expression); } private List<Integer> dfs(String exp) { if (memo.containsKey(exp)) { return memo.get(exp); } List<Integer> ans = new ArrayList<>(); if (exp.length() < 3) { ans.add(Integer.parseInt(exp)); return ans; } for (int i = 0; i < exp.length(); ++i) { char c = exp.charAt(i); if (c == '-' || c == '+' || c == '*') { List<Integer> left = dfs(exp.substring(0, i)); List<Integer> right = dfs(exp.substring(i + 1)); for (int a : left) { for (int b : right) { if (c == '-') { ans.add(a - b); } else if (c == '+') { ans.add(a + b); } else { ans.add(a * b); } } } } } memo.put(exp, ans); return ans; } }
Comments
Post a Comment