任务:查找包含N个开头和N个右括号的常规括号表达式的数量。从键盘输入N.
我发现这个算法可以解决并尝试理解它。
public static void addParen(ArrayList<String> list, int leftRem, int rightRem, char[] str, int count) {
if (leftRem < 0 || rightRem < leftRem) return; // some state
if (leftRem == 0 && rightRem == 0) { /* no additional left parentheses */
String s = String.copyValueOf(str);
list.add(s);
} else {
/* Add left parenthesis if there are parentheses of any kind */
if (leftRem > 0) {
str[count] = '(';
addParen(list, leftRem - 1, rightRem, str, count + 1);
}
/* Add a right parenthesis if the expression is true */
if (rightRem > leftRem) {
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;
}
但只能对第一个结果字符串执行此操作: ((()))
它如何继续工作?我们如何获得其他一对括号? 也许你可以提出其他版本来编程这个任务?
如果count = 3,结果:
((()))
(()())
(())()
()(())
()()()
答案 0 :(得分:0)
嗯,肯定是编程课程中的一个热门任务:)你会在网上找到很多像the one below这样的多种语言的解决方案。实际上,这个很难看。也许你深入研究它并提出一些能够在更大程度上轻抚编码员心灵的东西:)
QueryJobConfiguration
答案 1 :(得分:0)
请注意,您的任务是计算有效的括号序列,而不是输出它们。因此,让我们考虑有多少变体来制作长度为N(对)的有效序列(表示为S(N)):
You can get any valid sequence of length N-1 and add () pair after it
You can get any valid sequence of length N-2 and add opening parenthesis,
valid sequence of length 1, and closing parenthesis
...
You can get any valid sequence of length N-1-M and add opening parenthesis,
any valid sequence of length M, and closing parenthesis
...
You can make opening parenthesis, add any valid sequence of length N-1,
and closing parenthesis
所以整体公式:
S(N) = Sum[S(N-M-1)*S(M)] for M=0..N-1 (with S(0)=1)
只需将数组/列表从较小的值填充到较大的值。
示例:
S(3) = S(2)*S(0)+S(1)*S(1)+S(0)*S(2)=2+1+2=5
请注意,确实存在简洁的公式,但我认为您的教师希望解决方案具有一些逻辑结论