poj_1068_Parencodings_解题报告

14 篇文章 0 订阅

题目出处

题意:

对于字符串S有两种编码方式:

1. P-sequence:当遇到右括号时,记录下当前左边的所有左括号  

2. W-sequence: 当遇到右括号时,记录下与当前右括号匹配的左括号内的右括号数,并包括自己

解法:模拟

思路:用了最简单直接的方法,首先将P-sequence编码转换为原始字符串S,再由原始字符串S转换为W-sequence编码

此题解法有待日后优化

代码:

/*
360K 0MS
*/
#include <stdio.h>
#include <string.h>

int    p[20];
char   S[100];

void build(int *p, int n); //根据P还原字符串
void getw_sequence();      //根据字符串得到W

int main()
{
	int    i;
	int    t, n;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d", &n);
		for (i = 0; i < n; i++)
			scanf("%d", &p[i]);
		build(p, n);
		getw_sequence();
	}
	return    0;
}

void build(int *p, int n)
{
	memset(S, '\0', sizeof(w));
	memset(S, '(', p[0]);
	S[p[0]] = ')';
	int    i;
	int    w_index = p[0] + 1;
	for (i = 1; i < n; i++)
	{
		memset(&S[w_index], '(', p[i] - p[i-1]);
		w_index += p[i] - p[i-1];
		S[w_index++] = ')';
	}
}

void getw_sequence()
{
	int    i = 0;
	int    n = 1;
	int    k, num = 1; //num用做记录W中每当括号匹配时的右括号数
	while (S[i] != '\0')
	{
		if (S[i] == ')')
		{
			num = 1, n = 1; //每次发现右括号时,都需要将num和n置1
			k = i,   k--;
			while (n != 0)
			{
				if (S[k] == ')')
					n++, num++;
				if (S[k] == '(')
					n--;
				k--;
			}
			printf("%d ", num);
		}
		i++;
	}
	printf("\n");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值