思路
就是创建一个栈,然后将左括号进栈,之后寻找右括号,找到了,则匹配成功。
若最后栈中还有括号剩余,则输出NO
源码
#include<bits/stdc++.h>
using namespace std;
char s[500005];
stack<int> st;
int ans[500005];
int main(){
int len;
bool f;
cin>>s;
len = strlen(s);
f = true;
for(int i = 0;i < len; i++ ){
if(s[i]=='('){ //左括号进栈,
st.push(i+1); //第一个左括号为1,第二个为2
}
else{ //右括号进栈,
if(!st.empty()){ //如果非空,则说明匹配成功
ans[i + 1]=st.top(); // st.top返回栈顶元素
st.pop(); //左括号出栈
}
else{
f = false;
break;
}
}
}
if( !st.empty()){
f = false;
}
if(!f){
printf("No\n");
}
else{
printf("Yes\n");
for(int i=1;i<=len;i++){
if(ans[i]){
printf("%d %d\n",ans[i],i);
}
}
}
return 0;
}