链接:https://www.nowcoder.com/acm/contest/185/E
来源:牛客网
给定括号长度N,给出一串括号(只包含小括号),计算出最少的交换(两两交换)次数,使整个括号序列匹配。
我们认为一个括号匹配,即对任意一个')',在其左侧都有一个'('与它匹配,且他们形成一一映射关系。
输入描述:
第一行:整数N,表示括号序列长度 第二行:一个字符串,表示括号
输出描述:
一个整数,表示最少的交换次数
示例1
输入
6 (()))(
输出
1
示例2
输入
6 )))(((
输出
2
备注:
对于80%的数据:n≤3000 对于100%的数据,n≤5×106
大致思路:我们可以用一个栈来模拟全过程,把每一个“(”的括号入栈,然后在把能够完成匹配的出栈,最后返回栈里的元素个数k,这时候栈里的元素个数就表示为匹配的“( ”。我们可以动手模拟一下))((,这个时候k = 2,我们只需要交换两边就行了,操作数目为1,)))(((,这个时候 k = 3,我们可以依次交换两边的括号,操作数为 2.所以操作数 = k + (k & 1).
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char const *argv[])
{
stack<char> st;
char ch;
int n;
scanf("%d",&n);
//while(!st.empty()) st.pop();
while(n--){
cin>>ch;
if(ch == '('){
st.push(ch);
}
else{
if(!st.empty()){
st.pop();
}
}
}
//printf("%d\n",k);
int k = st.size();
// printf("%d\n",k);
if(k == 0) printf("%d\n",k);
else if(k > 0 && k <= 2){
printf("1\n");
}
else if(k > 2){
printf("%d\n",k / 2 + (k & 1));
}
return 0;
}