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
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());
}
}