【发布时间】:2017-02-01 20:29:12
【问题描述】:
我尝试做经典问题来实现一个算法来打印 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);
对我来说,它们具有相同的逻辑,就像在括号中,我们添加左括号'('每次都是可能的,但对于右括号')',我们只有在右括号的数量大于左边。我们可以在这里做同样的推理,不是吗?我们每次都可以添加 '/' 但是对于 '\' 我们必须在之前计算 '/' 的数量...
我发现这里特别困难的是我们如何在此处插入新行以拥有所有正确的山脉?
如果可能的话,你能帮我重用这段代码吗?还是我应该从头开始编写另一个代码?
【问题讨论】:
-
您在寻找解决此问题的代码吗? codegolf.stackexchange.com/questions/37922/… 。我不希望那里的答案对您没有帮助,但是目前很难理解您在问什么-问题中似乎有很多不相关的细节(例如,加泰罗尼亚语数字) ,并且缺少相关的详细信息(例如您遇到的问题)。
-
是的,这是完全相同的问题,我尝试在 java 中解决它(不是 python)
-
使用上面的代码得到像
//\//\/\\\这样的单行序列,然后将它们分成不同的行。要知道每个字符处于哪个级别,请检查序列并在每个/之后加 1,在每个\之前减 1,如下所示:0111222210。 -
你试过柏林噪声吗?查看 libnoise。