时间限制1000ms 空间限制131072K
蒜头君在纸上写了一个串,只包含’(’ 和’)’。一个’(’ 能唯一匹配一个’)’,但是一个匹配的’(’ 必须出现在’)’ 之前。请判断蒜头君写的字符串能否括号完全匹配,如果能,输出配对的括号的位置(匹配的括号不可以交叉,只能嵌套)。
输入格式
一行输入一个字符串只含有’(’ 和’)’,输入的字符串长度不大于 5000050000。
输出格式
如果输入括号不能匹配,输出一行 “No”,否则输出一行 “Yes”,接下来若干行每行输出 22 个整数,用空格隔开,表示所有匹配对的括号的位置(下标从 11 开始)。你可以按照任意顺序输出。
本题答案不唯一,符合要求的答案均正确
样例输入 1
(())
样例输出 1
Yes
1 4
2 3
样例输入 2
()()
样例输出 2
Yes
1 2
3 4
实现
package www.jisuanke.ds;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Stack;
/**
* @author wangchong
* @date 2019/5/3 15:53
* @email 876459397@qq.com
* @CSDN https://blog.csdn.net/wfcn_zyq
* @describe
*/
public class Code_07_KouHao {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String str = input.nextLine();
Stack<Character> stackLeft = new Stack<>();
Stack<Integer> stackIndex = new Stack<>();
HashMap<Integer,Integer> map = new HashMap<>();
int i = 0;
for (i = 0; i < str.length(); i++) {
if (str.charAt(i) == ')') {
if (!stackLeft.isEmpty()) {
stackLeft.pop();
map.put(stackIndex.pop(),i + 1);
} else {
break;
}
} else {
stackLeft.push(str.charAt(i));
stackIndex.push(i + 1);
}
}
if (stackLeft.isEmpty() && i == str.length() ) {
System.out.println("Yes");
for (HashMap.Entry entry : map.entrySet()
) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
} else {
System.out.println("No");
}
}
}