【蓝桥杯】括号匹配

题目

蒜头君在纸上写了一个串,只包含’(‘和’)’。一个’(‘能唯一匹配一个’)’,但是一个匹配的’(‘必须出现在’)'之前。请判断蒜头君写的字符串能否括号完全匹配,如果能,输出配对的括号的位置(匹配的括号不可以交叉,只能嵌套)。

输入格式

一行输入一个字符串只含有’(‘和’)’,输入的字符串长度不大于 50000 50000

输出格式

如果输入括号不能匹配,输出一行"No",否则输出一行"Yes",接下来若干行每行输出 2 2 个整数,用空格隔开,表示所有匹配对的括号的位置(下标从 1 1 开始)。你可以按照任意顺序输出。

本题答案不唯一,符合要求的答案均正确

样例输入

(())

样例输出

Yes

1 4

2 3

样例输入

()()

样例输出

Yes

1 2

3 4

题解

遇到 ‘(’ 入栈序号,遇到 ‘)’ 栈不空,出栈序号,用 map 保存映射

#include<iostream>
#include<string>
#include<stack>
#include<map>
using namespace std;
int main(){
	stack<int> s;
	map<int,int> m;
	string str;
	cin>>str;
	for(int i=0;i<str.length();i++){
		if(str[i]=='(')
			s.push(i+1);
		else{
			if(s.empty()){
				cout<<"No"<<endl;
				return 0;
			} 
			int t = s.top();
			s.pop();
			m[t] = i+1;
		}
	}
	if(s.empty()){
		cout<<"Yes"<<endl;
		for(map<int,int>::iterator it = m.begin();it!=m.end();it++)
			cout<<(it->first)<<" "<<(it->second)<<endl;
	}
	else
		cout<<"No"<<endl;
	return 0;
}

返回目录,查看更多

猜你喜欢

转载自blog.csdn.net/liyuanyue2017/article/details/86573915