题目
一个串,只包含(和)。一个(能唯一匹配一个),但是(必须出现在)之前,请判断括号能否完全匹配,如果能,输出配对的括号位置,匹配括号只能嵌套不能交叉。
输入:一个只由(和)构成的字符串,长度<50000。
输出:不匹配输出no,否则,输出yes,接下来若干行,每行输出2整数,空格隔开,表示匹配括号位置,下标从一开始,可以任意顺序输出。
分析与解答:
这个就是遇到左括号把下标压入栈,遇到右括号栈顶出栈,并且做标记,ans[i]=a.top(),意味着有括号的位置在i,左括号的位置在k。
如果循环时候遇见右括号,但是此时栈为空,说明左括号少了,如果循环完不为空,说明左括号多了。
最后遍历一遍标记数组,输出值和下标即可
#include<iostream>
#include<cstdio>
#include<stack>
#include<algorithm>
#include<cstring>
using namespace std;
char s[50010];
int ans[50010];
int main(){scanf("%s",s);stack<int> a;int n=strlen(s),f=1;for(int i=0;i<n;++i){if(s[i]=='('){a.push(i+1);}else{if(!a.empty()){ans[i+1]=a.top();a.pop();}else {f=0;break;}}}if(!a.empty()||!f){cout<<"No";}else{cout<<"Yes"<<endl;for(int i=0;i<=n;++i){if(ans[i]) cout<<ans[i]<<' '<<i<<endl;}}return 0;
}