高级农民
- 积分
- 1786
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2013-10-4
- 最后登录
- 1970-1-1
|
class GenerateParentheses {
public static void run() {
System.out.println(getAll(4, 2));
}
public static List<String> getAll(int m, int n) {
if (m % 2 != 0 || n % 2 != 0) {
throw new RuntimeException("Invalid arguement");
}
m /= 2;
n /= 2;
List<String> res = new ArrayList<>();
helper(res, new Stack<>(), m, n, 0, 0, new StringBuilder(), 0);
return res;
}
private static void helper(List<String> res, Stack<Character> stk, int m, int n, int used1, int used2, StringBuilder sb, int pos) {
if (pos == (m + n) * 2) {
res.add(sb.toString());
return;
}
if (used1 < m) {
sb.append('(');
stk.push('(');
helper(res, stk, m, n, used1 + 1, used2, sb, pos + 1);
sb.deleteCharAt(sb.length() - 1);
stk.pop();
}
if (used2 < n) {
sb.append('[');
stk.push('[');
helper(res, stk, m, n, used1, used2 + 1, sb, pos + 1);
sb.deleteCharAt(sb.length() - 1);
stk.pop();
}
if (!stk.isEmpty() && stk.peek() == '[') {
sb.append(']');
stk.pop();
helper(res, stk, m, n, used1, used2, sb, pos + 1);
sb.deleteCharAt(sb.length() - 1);
stk.push('[');
}
if (!stk.isEmpty() && stk.peek() == '(') {
sb.append(')');
stk.pop();
helper(res, stk, m, n, used1, used2, sb, pos + 1);
sb.deleteCharAt(sb.length() - 1);
stk.push('(');
}
}
} |
|