LeetCode 241. Different Ways to Add Parentheses
2017-03-05 16:38
211 查看
Description
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]
Solution
运用分治思想,遇到运算符时把问题分为两个子问题,并对两个子问题的结果求解,超时
vector<int> diffWaysToCompute(string input) { vector<int> result; for (int i = 0; i < input.size(); i++) { char c = input[i]; if (ispunct(c)) { vector<int> leftResult = diffWaysToCompute(input.substr(0, i)); vector<int> rightResult = diffWaysToCompute(input.substr(i + 1)); for (int j = 0; j < leftResult.size(); j++) { for (int k = 0; k < rightResult.size(); k++) { switch (c) { case '+': result.push_back(leftResult[j] + rightResult[k]); break; case '-': result.push_back(leftResult[j] - rightResult[k]); break; case '*': result.push_back(leftResult[j] * rightResult[k]); break; default: break; } } } } } if (result.empty()) { result.push_back(stoi(input)); return result; } }
注意if (ispunct(c))
,如果参数是除字母,数字和空格外可打印字符,函数返回非零值,否则返回零值。此处表示if(c == ‘+’ || c == ‘-’ || c == ‘*’)
显然上面这种方法会有很多对子问题的重复计算,效率不高。这里使用一个哈希表来保存已经计算过子问题的结果,下次需要用时直接取出,如果没有则进行计算。
#include <iostream> #include <vector> #include <map> using namespace std; vector<int> diffWaysToCompute(string input, map<string, vector<int>>&map1) { vector<int> result; for (int i = 0; i < input.size(); i++){ char c = input[i]; if (ispunct(c)){ string leftStr = input.substr(0, i); string rightStr = input.substr(i + 1); vector<int> leftResult; vector<int> rightResult; if(map1.find(leftStr) != map1.end()) leftResult = map1[leftStr]; else leftResult = diffWaysToCompute(leftStr, map1); if(map1.find(rightStr) != map1.end()) rightResult = map1[rightStr]; else rightResult = diffWaysToCompute(rightStr, map1); for (int j = 0; j < leftResult.size(); j++) { for (int k = 0; k < rightResult.size(); k++) { switch (c) { case '+': result.push_back(leftResult[j] + rightResult[k]); break; case '-': result.push_back(leftResult[j] - rightResult[k]); break; case '*': result.push_back(leftResult[j] * rightResult[k]); break; default: break; } } } } } if (result.empty()) result.push_back(stoi(input)); map1[input] = result; return result; } int main(){ map<string, vector<int>> map1; string input = "2*3-4*5"; vector<int> vec; vec = diffWaysToCompute(input, map1); for(int i = 0; i < vec.size(); i++) cout<<vec[i]<<' '; cout<<endl;
相关文章推荐
- [leetcode] 241. Different Ways to Add Parentheses
- LeetCode *** 241. Different Ways to Add Parentheses
- Leetcode 241. Different Ways to Add Parentheses (Medium) (cpp)
- LeetCode[241. Different Ways to Add Parentheses] 难度[medium]
- leetcode -- 241. Different Ways to Add Parentheses 【分治法】
- leetcode_middle_34_241. Different Ways to Add Parentheses
- LeetCode 241. Different Ways to Add Parentheses(加括号的不同方法)
- [leetcode] 241. Different Ways to Add Parentheses
- 【leetcode题解】【再做一遍】【47】【M】241. Different Ways to Add Parentheses
- leetcode 241. Different Ways to Add Parentheses (Python版)
- <LeetCode OJ> 241. Different Ways to Add Parentheses
- [LeetCode]241. Different Ways to Add Parentheses
- LeetCode 241. Different Ways to Add Parentheses
- [LeetCode]241. Different Ways to Add Parentheses
- 【LeetCode】241. Different Ways to Add Parentheses
- LeetCode 241. Different Ways to Add Parentheses
- leetcode 241. Different Ways to Add Parentheses-分治算法
- [leetcode] 241. Different Ways to Add Parentheses
- 【LeetCode】 241. Different Ways to Add Parentheses
- 【LeetCode】241. Different Ways to Add Parentheses