我正在研究破解编码面试中的一个问题,问题 9.6 第 110 页。
这就是问题所在:
实现一个算法来打印所有有效的(例如,正确打开和关闭的 n 对括号组合。示例
b(1) - "()"
b(2) - "(()), () ()"
b(3) - "((()))、(()())、(())()、()(())、()()()"
我正在尝试使用作者在第 107 页讨论的自下而上递归方法 - “我们首先知道如何解决一个简单案例的问题,比如只有一个元素的列表,然后弄清楚如何解决两个元素的问题,然后是三个元素元素等等。这里的关键是考虑如何从前一个案例中构建一个案例的解决方案“
这是我到目前为止的代码
static void print(int n) {
print(n, new HashSet<String>(), "", "");
}
static void print(int n, Set<String> combs, String start, String end) {
if(n == 0) {
if(!combs.contains(start + end)) {
System.out.print(start + end);
combs.add(start + end);
}
} else {
print(n-1, combs, "(" + start, end +")");
System.out.print(", ");
print(n-1, combs, start, end + "()");
System.out.print(", ");
print(n-1, combs, "()" + start, end);
}
}
为了得到这个代码,我从第一种情况到第二种情况。我看到
b(2) = "(b(1)), b(1),b(1)" 这段代码确实适用于前两种情况。不过,我真的在为第三种情况苦苦挣扎。有人可以给我一个提示(不是全部答案,可以翻到书的后面),关于如何从案例 2 到案例 3,或者换句话说,使用案例 2 到案例 3?就像你会如何从 (()), ()() 到
((())), (()()), (())(), ()(()), ()()() ? 你会放弃从 b(1) 到 b(2) 看到的模式,因为它对 b(2) 到 b(3) 不起作用吗?