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