您的位置:首页 > Web前端

LeetCode-241.Different Ways to Add Parentheses

2016-05-28 00:53 295 查看
https://leetcode.com/problems/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]


递归解

public IList<int> DiffWaysToCompute(string input)
{
IList<int> ret = new List<int>();
for (int i = 0; i < input.Length; i++)
{
char c = input[i];
if (c == '+' || c == '-' || c == '*')
{
IList<int> leftList = DiffWaysToCompute(input.Substring(0, i));
IList<int> rightList = DiffWaysToCompute(input.Substring(i + 1));
foreach (int left in leftList)
{
foreach (int right in rightList)
{
switch (c)
{
case '+':
ret.Add(left + right);
break;
case '-':
ret.Add(left - right);
break;
case '*':
ret.Add(left * right);
break;
}
}
}
}
}
if (ret.Count == 0)
ret.Add(Convert.ToInt16(input));
return ret;
}


动态规划优化一下

public class Solution
{
public IList<int> DiffWaysToCompute(string input)
{
Hashtable table = new Hashtable();
return Func(input, table);
}

private IList<int> Func(string input, Hashtable table)
{
IList<int> ret = new List<int>();
int len = input.Length;
for (int i = 0; i < len; i++)
{
char c = input[i];
if (c == '+' || c == '-' || c == '*')
{
IList<int> leftList, rightList;
string sub = input.Substring(0, i);
if (table.ContainsKey(sub))
leftList = (List<int>)table[sub];
else
leftList = Func(sub,table);

sub = input.Substring(i+1);
if (table.ContainsKey(sub))
rightList = (List<int>)table[sub];
else
rightList = Func(sub, table);

foreach (int left in leftList)
{
foreach (int right in rightList)
{
switch (c)
{
case '+':
ret.Add(left + right);
break;
case '-':
ret.Add(left - right);
break;
case '*':
ret.Add(left * right);
break;
}
}
}
}
}
if (ret.Count == 0)
ret.Add(Convert.ToInt16(input));
table[input] = ret;
return ret;
}
}


参考 https://leetcode.com/discuss/48488/c-4ms-recursive-%26-dp-solution-with-brief-explanation
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 递归