public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
List<Character> list = new ArrayList<>();
for(int i = 0; i < line.length(); i++)
list.add(line.charAt(i));
int res = opeNum(list);
System.out.println(res);
}
private static int opeNum(List<Character> list) {
if(list.size() == 2) {
return 1;
}
//思路:将左括号压入栈中。遇到一个右括号则弹出。如果没有栈中空了,则结束这次循环。
// indexes中保存的是这个可以被抹掉的右括号的索引。
Stack<Character> stack = new Stack<>();
List<Integer> indexes = new ArrayList<>();
for(int i = 1; i < list.size(); i++) {
if(list.get(i) == '(') {
stack.push(list.get(i));
}
else {
if(!stack.isEmpty()) {
indexes.add(i);
stack.pop();
} else {
indexes.add(i);
break;
}
}
}
//下面,运用回溯法,找到这个list中所有的操作序列。
int sum = 0;
list.remove(0);
for(int i = 0; i < indexes.size(); i++) {
//因为前面删除了第一个元素'(',所以,这里的索引减1
int tmp = indexes.get(i) - 1;
Character ch = list.get(tmp);
list.remove(tmp);
sum += opeNum(list);
list.add(tmp, ch);
}
list.add(0, '('); //惨,做题时写成了list.add('(');
return sum;
}
经过测试,至少()()()()和(((())))的情况可以通过,不至于只有10%。。。
#京东#