LeetCode Online Judge 题目C# 练习 - Generate Parentheses

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

"((()))", "(()())", "(())()", "()(())", "()()()"

 1         public static List<string> GenerateParenthesesDPOpt(int n)
 2         {
 3             List<HashSet<string>> ret = new List<HashSet<string>>();
 4             ret.Add(new HashSet<string>(){""});
 5 
 6             for (int i = 1; i <= n; i++)
 7             {
 8                 ret.Add(new HashSet<string>());
 9                 foreach (var s in ret[i - 1])
10                 {
11                     string temp = "()" + s;
12                     ret[i].Add(temp);
13 
14                     temp = s + "()";
15                     ret[i].Add(temp);
16 
17                     temp = "(" + s + ")";
18                     ret[i].Add(temp);
19 
20                     for (int j = 0; j < s.Length; j++) //Credit to ffengfrank, Thank you!
21                     {
22                         if (s[j] == '(')
23                         {
24                             temp = s.Insert(j + 1, "()");
25                             ret[i].Add(temp);
26                         }
27                     }
28                 }
29             }
30 
31             return ret[n].ToList();
32         }

 

代码分析:

  DP

n = 1 : ()

n = 2 : ()(), ()()重复, (())

n = 3 : ()()(), ()()()重复, (()()), ()(()), (())(), ((()))

......

利用HASHSET<string>减少时间复杂度。 每次比较的时间从O(n)到O(1)

感谢ffengfrank找到的bug,添加了20 ~ 27代码。

 

 1 public static List<string> GenerateParenthesesRecursive(int n)
 2         {
 3             string result = "";
 4             List<string> ret = new List<string>();
 5             GenerateParenthesesRecursive(n, n, result, ret);
 6             return ret;
 7         }
 8 
 9         public static void GenerateParenthesesRecursive(int left, int right, string result, List<string> ret)
10         {
11             if (left == 0 && right == 0)
12             {
13                 ret.Add(result);
14             }
15             else
16             {
17                 if (left > 0)
18                 {
19                     result += "(";
20                     GenerateParenthesesRecursive(left - 1, right, result, ret);
21                     result = result.Remove(result.Length - 1);
22                 }
23                 if (right > left)
24                 {
25                     result += ")";
26                     GenerateParenthesesRecursive(left, right - 1, result, ret);
27                     result = result.Remove(result.Length - 1);
28                 }
29             }
30         }

 

代码分析:

  递归做法。

 

 

posted @ 2012-09-06 05:00  ETCOW  阅读(487)  评论(2编辑  收藏  举报