LeetcodeDifferent Ways to Add Parentheses
Posted wuezs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetcodeDifferent 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]
思路:
从左到右开始遍历,遇到运算符 则将该运算符视为表达式的中心(left op right),表达式分成左右两部分,分别递归计算左右部分,并将结果和该运算符进行相应计算,本次计算相当于在该运算符两边加了个括号(left op right)。 将表达式中每个运算符都做一次如上操作,则得到所有可能情况下的结果值。为了优化时间,可以用一个hashmap保存已经计算过的情况。
算法:
Map<String, List<Integer>> maps = new HashMap<String, List<Integer>>();
public List<Integer> diffWaysToCompute(String input) {
List<Integer> results = new ArrayList<Integer>();
for (int i = 0; i < input.length(); i++) {
char t = input.charAt(i);
if (t == '+' || t == '-' || t == '*') {
String sleft = input.substring(0, i);
String sright = input.substring(i + 1);
List<Integer> left, right;
if (maps.containsKey(sleft)) {
left = maps.get(sleft);
} else {
left = diffWaysToCompute(input.substring(0, i));// 左右边所有可能的计算结果
}
if (maps.containsKey(sright)) {
right = maps.get(sright);
} else {
right = diffWaysToCompute(input.substring(i + 1));
}
for (int l : left) {
for (int r : right) {
int res = 0;
switch (t) {
case '+':
res = l + r;
break;
case '-':
res = l - r;
break;
case '*':
res = l * r;
break;
}
results.add(res);
}
}
}
}
if (results.size() == 0) { // 当input为数字时
results.add(Integer.parseInt(input));
}
return results;
}
以上是关于LeetcodeDifferent Ways to Add Parentheses的主要内容,如果未能解决你的问题,请参考以下文章
241. Different Ways to Add Parentheses
5 Ways to Learn and Remember Absolutely Anything
Different Ways to Add Parentheses
LeetCode:Different Ways to Add Parentheses