我试图做经典问题来实现一个算法来打印 n 对括号的所有有效组合。我发现了这个程序(效果很好):
public static void addParen(ArrayList<String> list, int leftRem, int rightRem, char[] str, int count) {
if (leftRem < 0 || rightRem < leftRem) return; // invalid state
if (leftRem == 0 && rightRem == 0) { /* all out of left and right parentheses */
String s = String.copyValueOf(str);
list.add(s);
} else {
if (leftRem > 0) { // try a left paren, if there are some available
str[count] = '(';
addParen(list, leftRem - 1, rightRem, str, count + 1);
}
if (rightRem > leftRem) { // try a right paren, if there’s a matching left
str[count] = ')';
addParen(list, leftRem, rightRem - 1, str, count + 1);
}
}
}
public static ArrayList<String> generateParens(int count) {
char[] str = new char[count*2];
ArrayList<String> list = new ArrayList<String>();
addParen(list, count, count, str, 0);
return list;
}
然后,当我在搜索加泰罗尼亚数字的应用程序时,我在这里发现了一个非常有趣的应用程序:https ://en.wikipedia.org/wiki/Catalan_number#Applications_in_combinatorics 它说:
我们可以使用加泰罗尼亚语数来形成具有 n 个上冲程和 n 个下冲程的山脉,它们都保持在原线之上。山脉的解释是山脉永远不会低于地平线
因此,我尝试重用上面的代码来实现这个问题的解决方案。我不确定,但我认为我们可以重用这段代码,因为它们似乎具有相同的“逻辑”。不幸的是,我尝试了很多方法来用“/”和“\”替换括号,但我失败了。
我试图做这样的事情:
str[count] = '/';
addParen(list, leftRem - 1, rightRem, str, count + 1);
}
if (rightRem > leftRem) { // try a right paren, if there’s a matching left
str[count] = '\\';
str[count+1] = '\n';
addParen(list, leftRem, rightRem - 1, str, count + 2);
对我来说,它们具有相同的逻辑,例如在括号中,我们添加左括号'('每次都是可能的,但对于右括号')',我们仅在右括号的数量大于左括号时才添加它。我们可以在这里做同样的推理,不是吗?我们每次都可以添加 '/' 但对于 '\' 我们必须先计算 '/' 的数量...
我发现这里特别困难的是我们如何在此处插入新行以拥有所有正确的山脉?
如果可能的话,你能帮我重用这段代码吗?或者我应该从头开始另一个代码?