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
Example 1
Input:
Output:
Example 2
Input:
Output:
递归解
动态规划优化一下
参考 https://leetcode.com/discuss/48488/c-4ms-recursive-%26-dp-solution-with-brief-explanation
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
相关文章推荐
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#中的尾递归与Continuation详解
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- PHP递归创建多级目录
- Javascript递归打印Document层次关系实例分析
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法
- 全排列算法的非递归实现与递归实现的方法(C++)
- php递归列出所有文件和目录的代码
- java递归菜单树转换成pojo对象
- 一个JavaScript递归实现反转数组字符串的实例
- Java中的递归详解(用递归实现99乘法表来讲解)
- C语言的递归思想实例分析