版权声明:本文为博主原创文章,转载请预先通知博主(〃'▽'〃)。 https://blog.csdn.net/m0_37624640/article/details/81806354
没想到这道题竟然是我感觉到最简单的……
做法:利用栈,栈存储的是字符串的下标
是"("时,对应的下标入栈。
是")"时,判断栈顶元素是否匹配,是的话,把他俩的下标,直接用数组哈希存储一下,即 pos[i] = i,然后把"("的下标弹出去
最后遍历哈希数组输出k个字符即可
AC代码:
#include<bits/stdc++.h>
#define rep(i,s,t) for(int i = (int)(s); i <= (int)(t); i++)
#define rev(i,t,s) for(int i = (int)(t); i >= (int)(s); i--)
#define pb(x) push_back(x)
#define all(x) x.begin(),x.end()
#define sz(x) (int)(x).size()
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const double PI = 4*atan(1.0);
const int maxn = 2e5+5;
const int INF = 0x3f3f3f3f;
bool pos[maxn];
stack<int> sc;
int main()
{
#ifdef LOCAL_FILE
freopen("in.txt","r",stdin);
#endif // LOCAL_FILE
ios_base::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,k;
cin>>n>>k;
string s;
cin>>s;
int p = 0;
for(int i=0;i<(int)s.length();i++)
{
if(s[i] == '(')
{
p = i;
break;
}
}
sc.push(p);
int cnt = 0;
for(int i=p+1;i<(int)s.length();i++)
{
if(!sc.empty()&&s[sc.top()] == '(' && s[i] == ')')
{
pos[sc.top()] = 1;
pos[i] = 1;
cnt+=2;
if(cnt == k)
break;
sc.pop();
//cout<<1<<endl;
}
else if(s[i] == '(')
{
//cout<<1<<endl;
sc.push(i);
}
// cout<<i<<endl;
}
int c = 0;
for(int i=0;i<maxn;i++)
{
if(pos[i])
{
cout<<s[i];
c++;
if(c == k)
break;
}
}
return 0;
}