您的位置:首页 > 编程语言 > Java开发

计蒜客习题(java)-括号匹配

2018-03-04 11:44 148 查看
题目要求:
蒜头君在纸上写了一个串,只包含
'('
')'
。一个
'('
能唯一匹配一个
')'
,但是一个匹配的
'('
必须出现在
')'
之前。请判断蒜头君写的字符串能否括号完全匹配,如果能,输出配对的括号的位置(匹配的括号不可以交叉,只能嵌套)。

输入格式

一行输入一个字符串只含有
'('
')'
,输入的字符串长度不大于 5000050000。

输出格式

如果输入括号不能匹配,输出一行
"No"
,否则输出一行
"Yes"
,接下里若干行每行输出 22 个整数,用空格隔开,表示所有匹配对的括号的位置(下标从 11 开始)。你可以按照任意顺序输出。本题答案不唯一,符合要求的答案均正确

样例输入1

(())

样例输出1

Yes
1 4
2 3

样例输入2

()()

样例输出2

Yes
1 2
3 4
思路:
使用栈这个数据结构,匹配到‘(’让该左括弧的下标+1入栈,碰到‘)’则弹栈,如果栈为空,弹不出栈,则说明括号不匹配,如果能弹栈,此时就用二维数组记录左括号和右括号的位置。遍历完括号字符串后,检测栈是否为空,若为空则括号匹配,若不为空则不匹配。
AC代码import java.util.*;
class Main {

public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
String k=cin.nextLine();//个数
Stack<Integer> s=new Stack<Integer>();
int [][]a=new int [k.length()+3][3];
int count=0;
for(int i=0;i<k.length();i++){
if(k.charAt(i)=='('){
s.push(i+1);
}
else{
if(!s.isEmpty())
{
a[count][0]=s.pop();
a[count][1]=i+1;
count++;
}
else
{
System.out.println("No");
break;
}

}
if( i==k.length()-1){
if(s.isEmpty()){
System.out.println("Yes");
for(int j=0;j<count;j++){
System.out.println(a[j][0]+" "+a[j][1]);
}
}
else{
System.out.println("No");
}
}
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: