私は Cracking the Coding Interview の問題 9.6 ページ 110 の問題に取り組んでいます。
ここに問題があります:
すべての有効な (例えば、n 対の括弧の適切に開いた組み合わせと閉じた組み合わせ) を出力するアルゴリズムを実装してください。例
b(1) - "()"
b(2) - "(()), () ()"
b(3) - "((())), (()()), (())(), ()(()), ()()()"
を使用しようとしています著者が 107 ページで説明しているボトムアップ再帰アプローチ - 「要素が 1 つしかないリストのような単純なケースの問題を解決する方法を知ることから始め、要素が 2 つ、次に要素が 3 つの場合の問題を解決する方法を見つけます。要素など。ここで重要なのは、前のケースから別のケースのソリューションを構築する方法を考えることです」
ここに私がこれまでに持っているコードがあります
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);
}
}
このコードを取得するために、最初のケースから 2 番目のケースまで作業しました。
b(2) = "(b(1)), b(1),b(1)" このコードは、最初の 2 つのケースで機能します。しかし、私は3番目のケースに本当に苦労しています。ケース 2 からケース 3 に移行する方法、つまりケース 2 を使用してケース 3 に移行する方法について、誰かがヒントを教えてくれますか? (())、()() から
((()))、(()())、(())()、()(())、()()() ? b(2) から b(3) ではうまくいかないので、b(1) から b(2) まで見たパターンを放棄しますか?