模拟的题型,基本难度不大,关键读懂题意:
对于给出的原括号串,存在两种数字密码串:
1.p序列:当出现匹配括号对时,从该括号对的右括号开始往左数,直到最前面的左括号数,就是pi的值。
2.w序列:当出现匹配括号对时,包含在该括号对中的所有右括号数(包括该括号对),就是wi的值。
题目的要求:对给出的p数字串,求出对应的s串。
串长限制均为20
提示:在处理括号序列时可以使用一个小技巧,把括号序列转化为01序列,左0右1,处理时比较方便
#include <iostream>
using namespace std;
int squence[50],p[50];
bool flag[50];
int main(){
int i,j,k,t,n,loc,left,cnt;
cin>>t;
while(t--)
{
cin>>n;
loc = 1;
left = 1;
memset(flag,0,sizeof(flag));
for (i = 1;i <= n;i++)
{
cin>>p[i];
while (left<p[i])
{
squence[++loc] = 0;//前面有p[i]个左括号
left++;
}
squence[++loc] = 1;//当前位置赋以右括号
}
for (i = 1;i <= 2*n;i++)
{
cnt = 0;
if (squence[i])//只有在右括号的位置才输出
{
flag[i] = true;
for (j = i-1;j > 0;j--)
{
if ((flag[j] == false) && (squence[j] == 0))//表示找到了当前还没有匹配的左括号
{
flag[j] = true;
for (k = i;k > j;k--)
{
cnt+=squence[k];//然后看匹配的括号之间有几个左括号
}
break;
}
}
cout<<cnt<<" ";
}
}
cout<<endl;
}
return 1;
}
poj 1068 括号搭配
最新推荐文章于 2020-12-08 11:02:22 发布