How to print all possible balanced parentheses for an expression?

前端 未结 9 1895
被撕碎了的回忆
被撕碎了的回忆 2020-12-15 11:41

For example, with elements a,b,c,d, there are 5 possible ways to take neighboring elements and reduce them into a single element, where exactly two elements mus

9条回答
  •  情书的邮戳
    2020-12-15 11:57

    Here is C# version of generating all possible balanced parenthesized strings from the given n+1 factors.

    Note solution for the problem basically satisfies the Catalan recursive relationship (for more details, you may refer to http://codingworkout.blogspot.com/2014/08/all-possible-paranthesis.html, http://en.wikipedia.org/wiki/Catalan_number)

    string[] CatalanNumber_GeneratingParanthesizedFactorsRecursive(string s)
            {
                if(s.Length == 1)
                {
                    return new string[] {s};
                }
                if(s.Length == 2)
                {
                    string r = "(" + s + ")";
                    return new string[] { r };
                }
                List results = new List();
                for (int i = 1; i < s.Length; i++)
                {
                    var r1 = this.CatalanNumber_GeneratingParanthesizedFactorsRecursive(
                        s.Substring(0, i));
                    var r2 = this.CatalanNumber_GeneratingParanthesizedFactorsRecursive(
                        s.Substring(i));
                    foreach(var s1 in r1)
                    {
                        foreach(var s2 in r2)
                        {
                            string r = "(" + s1 + s2 + ")";
                            results.Add(r);
                        }
                    }
                }
                return results.ToArray();
            }
    

    where

    string[] CatalanNumber_GeneratingParanthesizedFactors(string s)
            {
                s.ThrowIfNullOrWhiteSpace("s");
                if(s.Length == 1)
                {
                    return new string[] {s};
                }
                var r = this.CatalanNumber_GeneratingParanthesizedFactorsRecursive(
                    s);
                return r;
            }
    

    And Unit tests are

    [TestMethod]
            public void CatalanNumber_GeneratingParanthesizedFactorsTests()
            {
                var CatalanNumbers = new int[] { 1, 1, 2, 5, 14, 42, 132, 429, 
                    1430, 4862, 16796 };
                string input = "";
                for (int i = 1; i <= 10; i++)
                {
                    input += i;
                    var results2 = this.CatalanNumber_GeneratingParanthesizedFactors(input);
                    Assert.AreEqual(results2.Length, CatalanNumbers[input.Length-1]);
                    Debug.WriteLine("-----------------------------------------------");
                    foreach (string ss in results2)
                    {
                        Debug.WriteLine(ss);
                    }
                }
                string s = "a";
                var r = this.CatalanNumber_GeneratingParanthesizedFactors(s);
                Assert.AreEqual(r.Length, 1);
                Assert.AreEqual(s, r[0]);
                s = "ab";
                r = this.CatalanNumber_GeneratingParanthesizedFactors(s);
                Assert.AreEqual("(ab)", r[0]);
                s = "abc";
                r = this.CatalanNumber_GeneratingParanthesizedFactors(s);
                string[] output = new string[] { "(a(bc))", "((ab)c)" };
                Assert.AreEqual(2, r.Length);
                foreach(var o in output)
                {
                    Assert.AreEqual(1, r.Where(rs => (rs == o)).Count());
                }
                s = "abcd";
                r = this.CatalanNumber_GeneratingParanthesizedFactors(s);
    
                output = new string[] { "(a(b(cd)))", "(a((bc)d))", "((ab)(cd))", "(((ab)c)d)", "((a(bc))d)"};
                Assert.AreEqual(5, r.Length);
                foreach (var o in output)
                {
                    Assert.AreEqual(1, r.Where(rs => (rs == o)).Count());
                }
            }
    

提交回复
热议问题