题目链接:点击打开链接
题意:对于只含左右括号的字符串,有两种加密方法:
第一种:P串:代表当前右括号的左边有多少个左括号
第二种:W串:代表当前右括号中包含了多少个匹配的括号。
给你P串让你求W串。
题解:
我直接当模拟来处理,想求W串,不如先还原原来的字符串,然后遍历这个字符串,定义一个cnt表示有多少个右括号,当遍历到右括号时,cnt++,遍历到没有被匹配到的左括号的时候,跳出向左遍历,因为之前的括号已经被匹配上了,只用去匹配当前这个没有匹配上的右括号,然后并记录这个跟过程中有几个匹配的括号即可。
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 25;
int a[maxn];
char s[maxn*3];
int book[maxn*3];
int main(){
int z;
scanf("%d",&z);
while(z--){
memset(book,0,sizeof(book));
memset(a,0,sizeof(a));
memset(s,0,sizeof(s));
int n;
scanf("%d",&n);
for(int i = 1 ; i <= n ; i ++)
scanf("%d",&a[i]);
int ans = 0;
for(int i= 0 ; i < a[1] ; i ++){
s[ans++] = '(';
}
for(int i = 2 ; i <= n ; i ++){
if(a[i-1] == a[i])
s[ans++] = ')';
else {
s[ans++] = ')';
for(int j = a[i-1] ; j < a[i] ; j ++)
s[ans++] = '(';
}
}
s[ans++] = ')';
for(int i = 0 ; i < ans ; i ++){
int cnt = 1;
if(s[i] == ')'){
for(int j = i - 1; j >= 0 ; j --){
if(s[j] == ')')
cnt ++;
if(s[j] == '(' && (!book[j])){
book[j] = 1;
break;
}
}
cout << cnt << " ";
}
}
cout << endl;
}
}