n 対の括弧のすべての有効な (たとえば、適切に開いたものと閉じたもの) の組み合わせを出力するアルゴリズムを実装します。例: 入力: 3 (例: 3 対の括弧) 出力: ()()()、()(())、(())()、((()))
答えは次のとおりです。
private static void printPar(int count)
{
char[] str = new char[count*2];
printPar(count,count,str, 0);
}
private static void printPar(int l, int r, char[] str, int count)
{
if(l < 0 || r < l)
return;
if (l ==0 && r == 0)
{
System.out.println(str);
}
else
{
if (l > 0 )
{
str[count] = '(';
printPar(l-1, r, str, count + 1);
}
if (r > 0)
{
str[count] = ')';
printPar(l, r-1, str, count + 1);
}
}
}
しかし、誰かが説明が十分に簡単であると主張していますが、私は解決策を完全には理解していません。(このコードは正常に動作します)
私の意見では、このコードは、左括弧がさらにある場合と同じように機能し、次に左括弧を追加します。したがって、((()))の条件のみ if (l > 0 ) が r > 0 の前に現れるため、常に左側のすべての条件を最初に処理する必要があります。
しかし、このコードはこの状況 "()(())" をどのように処理するのでしょうか? 私はこのコードをデバッグし、「((()))」を出力した後にそれを見つけます。l =1、r =3、および str="((()))" および count = 2 の状況になりました。これは私には意味がありません。
また、誰かが時間/空間の複雑さとは何かを説明できれば、それは私にとって非常に役立ちます.
前もって感謝します。