算法学习之路|POJ 1068 Parencodings(简单模拟)

本文介绍了一种通过模拟方法解决括号匹配问题的算法。给定一个由括号组成的字符串及对应的左括号计数数组,该算法能计算出每个右括号与其匹配左括号间的左括号数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

有一个括号串(括号成对),给出一串数字数组p,p[i]表示从左往右第i个右括号左边共有p[i]个左括号,求一个数组w,w[i]表示第i个右括号和其所匹配的左括号之间有多少个左括号(包括这个左括号本身)

一个例子:

括号串:    (((()()())))

P 4 5 6 6 6 6

W 1 1 1 4 5 6

思路

用一个vis数组标标记,1表示左括号,0表示右括号,模拟出w数组时用2标记已经用过的左括号,-1标记已经用过的右括号

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn 100
int main()
{
    int p[maxn],w[maxn],vis[maxn];
    int t,n,index,ww;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        memset(vis,0,sizeof(vis));
        memset(w,0,sizeof(w));
        index=1;//标记vis数组
        ww=1;
        p[0]=0;
        w[0]=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&p[i]);
            int temp=p[i]-p[i-1];
            for(int j=1;j<=temp;j++)
            {
                vis[index++]=1;
            }
            index++;
        }
        for(int i=1;i<=n*2;i++)//输入数字有n个,说明括号有n对,因此vis数组有2n的长度
        {
            int index2=1;//标记w数组
            if(vis[i]==0)
            {
                vis[i]=-1;
                int x=i;
                while(vis[x]!=1)
                {
                    if(vis[x]==2)
                    {
                        index2++;
                    }
                    x--;
                }
                w[ww++]=index2;
                vis[x]=2;
            }
        }
        for(int i=1;i<=n;i++)
        {
            printf("%d",w[i]);
            if(i<n)
                printf(" ");
        }
        printf("\n");
    }
    return 0;
}

就是简单模拟,没有坑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值